const char * const因字符串(?)而改变

时间:2015-08-10 22:07:33

标签: c++ c++11

你好我正在建立一个项目,今天在500行代码之后,我将拍摄自己。今天我开始了一个新课程,一些非常奇怪的事情正在发生:

self.unsetPasswordWasLoaded

和cpp文件:

class Target {
public:
Target(const int port);
virtual ~Target();

private:
    const char*  initialize_port(const int port) const;
    const char *const port;
};

就像你在cpp文件中看到的那样,当默认构造函数被调用时,它会输出“this-> port”,然后我创建一个字符串,然后我再次打印它。怎么可能得到不同的反应?

来自netbeans:

80

目标2

跑完了;退出值0;实时:20ms;用户:0ms; system:0ms

PS:在函数initialize_port(const int port)中我给出一个标准的返回值,例如返回“80”;一切都好。在构造函数中我用char *替换字符串时,一切都还可以。

PS2:我知道我的RAM存在问题。如果有人编译并且输出没有问题(cout),请告诉我。

提前致谢。

2 个答案:

答案 0 :(得分:3)

问题来自:

{
   string port_str = std::to_string(port);
   const char* port_char=port_str.c_str();
   return port_char; 
}

return发生时,port_str被销毁,因为它是该代码块的语言环境变量。然后port_char是一个悬空指针(一个用于指向现在已被销毁的对象的指针)。

使用该指针会导致未定义的行为,并在您使用指针时解释您的奇怪效果。

要解决此问题,请停止使用原始指针。最简单的解决方法是使用std::string代替。

答案 1 :(得分:0)

问题是port_str.c_string()的返回值仅在port_str的生命周期内有效。由于它在initialize_port中的堆栈上分配,因此一旦该函数返回就变为无效。

在你的构造函数中,初始化test3字符串时,它最终会占用与port_str相同的内存(主要是偶然)。

如果需要使用const char *,则需要为initialize_port中的字符串分配新内存(并在构造函数中释放它!)。或者只是坚持使用std:string对象。