0

问题如下:

有一个构造函数的调用,其中指针是一个参数

 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)。此外,它在调试模式下工作,而不是在发布模式下工作。

4

2 回答 2

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_pszBufDevice构造函数之前,请确保它是NUL 终止的并且strcpy目标指针足够大

注意:此分析仅基于您显示的代码片段。(我不知道在您省略显示的实际代码中是否存在其他问题。)

于 2013-02-28T11:17:12.147 回答
0

很好的输入,但我已经用别的方法解决了。我有一些用于库的头文件“不同步”。我只需要更新它们。奇怪这如何影响其他事情。

于 2013-02-28T12:57:21.040 回答