【问题标题】:Delete memory error删除内存错误
【发布时间】:2011-01-23 12:00:38
【问题描述】:

我有以下场景,

class foo
{
  ...
  private:
   char *_test;
};

void foo::setTest()
{
  if( 0 != _test ) delete [] _test;
}

函数setTest 在调用时会抛出一个错误,因为它试图删除尚未分配的_test。发生这种情况是因为 _test 未设置为 0X0。

谁能帮我理解这个?

【问题讨论】:

    标签: c++ memory-management dynamic-memory-allocation delete-operator


    【解决方案1】:

    您应该在构造函数中使用NULL 初始化_test。

    喜欢:

    foo:foo {
     _test = NULL;
    }
    

    如果你不 _test 会有垃圾值。

    正如 Chris 所指出的,作为参数传递给 delete 或 (delete[]) 的值必须是指向先前使用 new 分配的内存块的指针,或者是空指针(在在空指针的情况下,删除不会产生任何影响),实际上使您的 NULL 检查变得多余。

    【讨论】:

    • 正如问题所说,_test 根本没有被初始化。 :-P
    • 正确的语法是:foo::foo() : _test(0) {},其中0 是可选的(但更明确地阅读),因为_test() 将值初始化指针将意味着“设置为0”无论如何。
    【解决方案2】:

    好吧,如果_test 没有被分配任何值,那么它有未定义的值。如果您想要理智的行为,则不能将该值用于任何事情。变量在使用前需要赋值。

    顺便说一句,deletedelete[] 可以安全地调用空指针,因此 == 0 检查是多余的。

    【讨论】:

      【解决方案3】:

      有两种可能:

      如果您从不初始化foo::_test,那么当您的类被构造时,该变量可能会包含随机数据。 C++ 不会将指针初始化为 null(与 Java、C# 或大多数其他高级语言不同)。您应该始终(总是!)将指针初始化为 NULL 或有效值。在构造函数中更改为 char *_test = NULL; 或以其他方式初始化 _test

      或者,_test 可能在您的示例中未显示的其他位置被删除,但未设置为 NULL。每当你删除一个类成员时,你应该把它设置为NULL,以防止这种双重释放问题。

      【讨论】:

      • 在 C++ 中,空指针被称为 0 或 nullptr(后者仅在 C++0x 中)。它不叫null
      • 也可能是对象被复制了,没有复制构造函数。
      • @Chris Jester-Young:如果你要挑剔,请确保你知道细节。在 C++03(当前标准)中,指针实际上在标准中的任何地方都称为“null”,它被定义为通过将整数值 0 转换为指针类型获得的指针。该标准还要求NULL 是定义为0 的宏(与C 不同,在标准中它被定义为指针类型,通常在实现中为(void*)0)。即将发布的标准将定义nullptr 为空指针值。
      • @David:原始答案说null(在<code> 块中),这意味着您在程序文本中确实有null。这就是我要纠正的。答案的作者将null修改为NULL,当然没问题(我只是懒得再评论了)。
      • @David:就我个人而言,我讨厌NULL 的使用(部分原因是,作为一个宏,它与0 或nullptr 相比是“二等”的),所以我没有提及它在我最初评论的选择列表中(以及为什么当答案被更改为使用它时我没有进一步评论它)。
      猜你喜欢
      • 2015-10-15
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多