问题如下:
有一个构造函数的调用,其中一个指针是一个参数
m_pszBuf= new char[260];
//Still valid , to prove i'm printing the address
std::cout <<"Address "<< (void*)m_pszBuf <<std::endl;
device = new Device(m_pszBuf);
Device::Device(char* _ptr){
strcpy(dest,_ptr);
}
有趣的是,在构造函数调用之前,指针仍然有效并且具有地址和值,但是一旦它进入ctor,它就会变成坏指针(0x0000005c)。此外,它在调试模式下工作,但不在发布模式下工作。
答案 0 :(得分:4)
您可以像这样初始化m_pszBuf
:
m_pszBuf = new char[260];
然后你像这样调用Device
构造函数:
device = new Device(m_pszBuf);
在Device
内部构建器中,来自strcpy
来源的m_pszBuf
来电:
Device::Device(char* _ptr) // _ptr == m_pszBuf
{
strcpy(dest, _ptr);
}
但如果m_pszBuf
不是NUL终止的,strcpy
不会在分配的缓冲区末尾停止,并且它可以从越界内存中复制垃圾,而你可以超出dest
缓冲区。
因此,在将m_pszBuf
传递给Device
构造函数之前,请确保它是 NUL终止并且strcpy
目标指针足够大强>
注意:此分析仅基于您展示的代码段。 (我不知道你的实际代码中是否省略了显示还有其他问题。)
答案 1 :(得分:0)
很棒的输入,但我用其他东西解决了它。我有一些用于库的Header文件“不同步”。我只需要更新它们。奇怪这是如何影响其他事情的。