你好我正在建立一个项目,今天在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),请告诉我。提前致谢。
答案 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对象。