C ++编程 - 这种分配是不可避免的内存泄漏吗?

时间:2014-05-21 13:28:53

标签: c++ memory-management

我对粘贴的代码有疑问。 我为int分配了内存并删除了(像往常一样)。 但在某处,我看到这个sysntax(第1行)分配了一个匿名的int空间。 如何释放这个空间,这不会导致内存泄漏吗?

main(){
  int *p = new int;
  new int;

  if(p)
   delete p;
  system("PAUSE");
  return 0;
}

2 个答案:

答案 0 :(得分:14)

如果您分配内存,并故意选择不指向它,那么您就无法释放它。

C ++为你提供了足够的绳索,让你可以用自己的脚瞄准枪 这不是什么新鲜事。


另一个错误是检查p的值以查看它是否已成功分配 只有在较旧的编译器上,new如果失败则返回NULL。在较新的编译器上,失败的new将导致抛出std::bad_alloc异常。

所以在这段代码中,(假设您使用的是过去十年的编译器),您知道

  • new成功,p有效/非空。
  • 抛出了异常。

p无法结束NULL

即使p最终为NULL,在delete值上调用NULL也非常安全,并且没有任何问题。

所以你的示例代码很可能是:

int main()
{
  int *p = new int;  // Will throw exception if fails

  new int;           // Deliberate Mem Leak

  delete p;          // No need to check NULL
  system("PAUSE");   // Pause to see results (NOTE: this is skipped if an exception is thrown!)
  return 0;         
}

答案 1 :(得分:0)

嗯,这是C ++,所以unavoidable是一种(轻微)夸大其词。

您需要的“全部”替换全局operator new,并跟踪分配。 现在:我无法想象这样做是真正的代码,但仅仅是类类型的等效是在实践中完成的事情(虽然我并不暗示它是最好的练习!)

例如,这个(否则非常愚蠢)代码不会泄漏。

int count = 0;
void* operator new (size_t size)throw(std::bad_alloc)
{
    if (size == sizeof(int))
    {
        ++count;
        if (count == 2)
            return &count;
    }
    return malloc (size);
}

void operator delete (void *p)throw()
{
    if (p != &count)
        free(p);
}

int main()
{
    int *p = new int;
    new int;
    delete p;
    system("PAUSE");
    return 0;
}