【问题标题】:Pointer gets lost in the release build [duplicate]指针在发布版本中丢失[重复]
【发布时间】:2013-02-28 10:45:47
【问题描述】:

问题如下:

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

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

【问题讨论】:

  • 那么第一行是无效的(假设您不能将Foo* 转换为Foo)。我们需要查看更多代码。 ptr 来自哪里?
  • 我希望你的意思是Foo* f = new Foo(ptr)
  • 请贴一些真实的代码。过度简化它,你/我们错过了有问题的部分
  • 除非“真实代码”由于“未声明的类型:设备”等原因无法编译。它的不是“真实代码”。此外,由于这是一个动态成员(并且 Device 将其用于看似同样邪恶的邪恶目的),请阅读 The Rule of Three 并确保所有指针拥有的资源(您应该努力使其拥有 none)在复制构造函数、赋值运算符和析构函数中得到适当的管理和说明。
  • 发布最少的代码来演示您的问题并且仍然可以编译。如果您知道消除什么是不重要且安全的,则无需寻求帮助。这并不意味着发布大量代码:而是修剪所有您认为不相关的内容,定期确认问题仍然存在,直到您有一些简短但完整的内容。或者,写一个你认为会出现问题的小程序,确认它,然后发布。

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


【解决方案1】:

你像这样初始化m_pszBuf

m_pszBuf = new char[260];

然后你像这样调用Device 构造函数:

device = new Device(m_pszBuf);

Device 构造函数内部,有一个来自m_pszBuf 源的strcpy 调用:

Device::Device(char* _ptr) // _ptr == m_pszBuf
{
    strcpy(dest, _ptr);
}

但是如果m_pszBuf不是NUL终止的,strcpy不会停在分配缓冲区的末尾,它可以从越界内存中复制垃圾,你可以溢出dest缓冲区。

因此,在将m_pszBuf 传递给Device 构造函数之前,请确保它是NUL 终止的 并且strcpy 目标指针足够大

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

【讨论】:

  • +1 这很可能是正确的。调试分配器通常将内存初始化为零(我讨厌它,因为它使在调试构建中查找此类问题变得更加困难)。不错的收获。
  • 这与目的地无关,它是在构造函数内部成为无效指针的源。它停下来指向任何东西。
  • @thebaconing:可能是因为strcpy(或其他什么?)覆盖了它?很难做到“心理调试” :) 你可能想提供一个可编译的代码 sn-p 来显示问题。还要考虑@WhozCraig 关于三法则 的评论(或者如果Device 类没有复制语义,请声明private 复制构造函数和operator=)。但是您是否尝试过按照我的建议和 NUL 终止 m_pszBuf? (或者只使用适当大小的memcpy 而不是strcpy...)。
  • +1 @thebaconing 如果您不确定,请在 while/for 循环中将 strcpy 替换为每个字符副本的字符,看看问题是否仍然存在。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 2013-09-17
    • 1970-01-01
    • 2014-03-26
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    相关资源
    最近更新 更多