之前我使用过extern关键字,但现在我有一个非常奇怪的问题。
首先,我的common.hh文件包含extern变量的声明:
//some extern declarations
extern const char* PATH;
在我的main.cc中,我执行以下操作(暂时忽略cout):
#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中所示,整个问题就解决了。我没有弄错,所有其他外部变量都可以正常工作。
修改 问题现在已解决。我刚刚在main.cc中执行了以下操作:
std::string tmp = somePath;
PATH = tmp.c_str();
我只是不明白为什么这样可以解决这个问题,因为理论上tmp
和somePath
应该有相同的范围,直到在other.cc中调用函数之后才能销毁它执行。换句话说:我在other.cc中的函数调用是在somePath
的范围结束之前。
答案 0 :(得分:2)
somePath.c_str()
的生命周期受somePath
变量的约束。一旦超出范围,PATH
指向将被重用的内存。
您可以PATH
代替std::string
代替char*
吗?如果没有,则必须使用somePath.c_str()
或类似内容复制strdup
的值。
答案 1 :(得分:1)
c_str
是std::string
的一种方法,如果字符串被更改或销毁,该方法将变为无效。例如,请参阅之前question中有关c_str
生命周期的详细信息。
您可以将PATH
设为std::string
并让它复制或手动复制到已分配足够内存的char *
。然后考虑何时解除分配。
修改 - 回复您的修改
你在哪里
std::string tmp = somePath;
PATH = tmp.c_str();
你声称&#34; tmp和somePath应该具有相同的范围&#34; - 他们不。
PATH
属于全球范围,您已将其指定为tmp
&#39; s c_str()
。