[英]C++ extern const char* not working as expected
我以前使用过extern关键字,但是现在我遇到了一个非常奇怪的问题。
首先,我的common.hh文件包含extern变量的声明:
//some extern declarations
extern const char* PATH;
在我的main.cc中,执行以下操作(暂时忽略提示):
#include "common.hh"
const char* PATH;
int main(const int argc, const char* argv[]){
PATH = somePath.c_str();
//std::cout << PATH << std::endl; //will print the correct path
//std::cout << std::string(PATH) << std::endl; //will fix the problem occuring later
//some function calls to other files where PATH is used
//... somePath still in scope ...
//... somePath is about to be destroyed
}
现在,在发生问题的地方还有其他文件Other.hh和Other.cc:首先是我的Other.hh
#include "common.hh"
//function declarations and some other stuff
在Other.cc中,访问PATH时出现问题:
#include "Other.hh"
void someFunction(...){
std::cout << PATH << std::endl; //When accessing PATH here again it prints garbage
在我的文件Other.cc中,我需要在main.cc中定义的const char * PATH,但是由于某些原因,PATH已更改。 如果我在main.cc的某处执行std :: string(PATH),则整个问题已解决,如上面的cout所示。 我没有弄错,我所有其他的extern变量都工作正常。
编辑:问题目前已解决。 我在main.cc中做了以下操作:
std::string tmp = somePath;
PATH = tmp.c_str();
我只是不明白为什么这可以解决问题,因为理论上tmp
和somePath
应该具有相同的作用域,并且应该在执行other.cc中的函数调用之后才能销毁。 换句话说:在other.cc我的函数调用的范围之前somePath
已经结束。
somePath.c_str()
的生存期受somePath
变量限制。 一旦超出范围, PATH
指向将被重用的内存。
您可以将PATH
std::string
而不是char*
吗? 如果不是这样,则必须使用strdup
或类似方法复制somePath.c_str()
的值。
c_str
是std::string
的方法,该方法在更改或销毁字符串后变得无效。 例如,在上一个问题中查看有关c_str
生存期的详细信息。
您可以将PATH
设为std::string
并进行复制,也可以手动将自己复制为char *
并分配足够的内存。 然后考虑何时取消分配。
编辑 -回应您的编辑
你在哪里
std::string tmp = somePath;
PATH = tmp.c_str();
您声称“ tmp和somePath应该具有相同的作用域”-他们没有。 PATH
在全局范围内,您已在此处将其分配为指向tmp
的c_str()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.