指针在发布版本中丢失

时间:2013-02-28 10:45:48

标签: c++ pointers visual-studio-2005

问题如下:

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

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

2 个答案:

答案 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文件“不同步”。我只需要更新它们。奇怪这是如何影响其他事情的。