繁体   English   中英

C ++ extern const char *无法正常工作

[英]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();

我只是不明白为什么这可以解决问题,因为理论上tmpsomePath应该具有相同的作用域,并且应该在执行other.cc中的函数调用之后才能销毁。 换句话说:在other.cc我的函数调用的范围之前somePath已经结束。

somePath.c_str()的生存期受somePath变量限制。 一旦超出范围, PATH指向将被重用的内存。

您可以将PATH std::string而不是char*吗? 如果不是这样,则必须使用strdup或类似方法复制somePath.c_str()的值。

c_strstd::string的方法,该方法在更改或销毁字符串后变得无效。 例如,在上一个问题中查看有关c_str生存期的详细信息。

您可以将PATH设为std::string并进行复制,也可以手动将自己复制为char *并分配足够的内存。 然后考虑何时取消分配。


编辑 -回应您的编辑

你在哪里

std::string tmp = somePath;
PATH = tmp.c_str();

您声称“ tmp和somePath应该具有相同的作用域”-他们没有。 PATH在全局范围内,您已在此处将其分配为指向tmpc_str()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM