我目前正在学习C++,遇到了一些麻烦。
我使用了很多#define
来开发程序,但我想使用static const
代替(碰撞/类型/作用域... )。
所以,现在我的代码看起来像这样:
file1.hpp
class A {
public:
static const std::string MY_CONST_VAR;
};
file1.cpp
const std::string A::MY_CONST_VAR = "some string";
file2.cpp
static std::string arrayOfString[] = {
A::MY_CONST_VAR,
...
};
我的代码使用-W -Wall -Wextra -Werror标志编译时没有警告/错误。
然而,当我尝试运行它时,会导致段错误。
我已经使用valgrind运行它,并得到以下输出:
==11239== Invalid read of size 4
==11239== at 0x5F525CB: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==11239== by 0x40D076: _GLOBAL__sub_I__ZN16GraphicInterface13DEFAULT_WIDTHE (GraphicInterface.cpp:42)
==11239== by 0x51AC7C: __libc_csu_init (in /home/simon/PSU_2013_zappy/gui/gui_zappy)
==11239== by 0x66D8E54: (below main) (libc-start.c:246)
==11239== Address 0xfffffffffffffff8 is not stack'd, malloc'd or (recently) free'd
因此,在arrayOfString实例化期间发生了段错误。我认为问题在于在常量之前分配了arrayOfInt。但是在这种情况下,是否可以使用静态const来达到这个目的?
我不知道如何修补这个问题。我做错了吗?有更好的方法吗?如何解决这个问题?
int
支持静态初始化,而string
需要动态初始化。通过用“int”替换“string”,您完全改变了示例的语义。不要替换,请发布真实代码。 - AnT stands with Russia