C++ 在这种情况下内存泄漏?反复使用新关键字

C++ 在这种情况下内存泄漏?反复使用新关键字,c++,pointers,memory,memory-leaks,heap,C++,Pointers,Memory,Memory Leaks,Heap,我对内存泄漏非常谨慎,所以我想我应该对此进行验证。在下面的示例中,是否会出现内存泄漏?我的直觉是肯定的 class Handler // Class definition {public: ~Handler(); int* ptrToInts; }; Handler::~Handler() // Class destructor { delete[] ptrToInts; } Handler handler; // Global object

我对内存泄漏非常谨慎,所以我想我应该对此进行验证。在下面的示例中,是否会出现内存泄漏?我的直觉是肯定的

class Handler        // Class definition
{public:
  ~Handler();
  int* ptrToInts;    
};

Handler::~Handler()  // Class destructor
{
  delete[] ptrToInts; 
}

Handler handler;     // Global object


void aFunction()
{
    handler.ptrToInts = new int[20];
}


int main()
{
  bool quit = false;

  while(!quit)
    {
      aFunction(); 
    }

  return 0;
}
ptrtoint会在同一时间在不同的内存中创建20个不同的新int吗

另外,另一个问题是,如果没有析构函数,动态分配的内存会被释放吗?将类的生命周期视为程序的持续时间,它会清理所有“新”内存吗


编辑:谢谢你的回答。我问这个问题的原因是因为每次调用WndProc进行原始输入时,我都会尝试调用new和delete,这就是MSDN告诉您的方法。似乎效率很低。

delete[]
释放
new
分配的内存。每次使用
new
,都需要
delete

关于另一个问题,根据以下内容:


MyClass*p1=新的MyClass[5];//分配和构造五个对象

一旦重新分配指针而不使用
delete[]
取消分配堆上已分配的内存,就会造成内存泄漏。如果循环
a函数()
,每次调用指针时它都会重新分配指针,则会发生这种情况


至于第二个问题,析构函数只会
删除[]
分配给指针的最后一个数组。

是的,当您多次调用函数时会出现内存泄漏,每次调用后都没有显式解除分配
处理程序。ptrToInts

void aFunction()
{
    handler.ptrToInts = new int[20];
}

//-----somewhere we see the caller

while(!quit)
    {
      aFunction(); 
    }
然而,这是一个检测泄漏的小案例。。。你应该学会使用和使用


请参见

当然存在内存泄漏。您在中分配整数

void aFunction()
{
    handler.ptrToInts = new int[20];
}
没有先释放旧Int,比如

void aFunction()
{
    delete [] handler.ptrToInts;
    handler.ptrToInts = new int[20];
}
可以

调用
affunction()
将导致“无限”内存分配。 你的析构函数只释放最后分配的整数,甚至永远不会被调用

为什么处理程序不管理自己的内存

在对象外部分配内存并在对象内部释放内存是非常糟糕的做法,反之亦然

为什么不以这种方式实现处理程序类:

class Handler
{
public:
  Handler();
  ~Handler();
  void aMethod();
private:
  int* ptrToInts;    
};

Handler::Handler() {
  handler.ptrToInts = new int[20];
}

Handler::~Handler() {
  delete[] ptrToInts; 
}

void Handler::aMethod() {
  delete[] ptrToInts; 
  handler.ptrToInts = new int[20];
}

int main() {
  bool quit = false;
  Handler handler;

  while(!quit) {
    handler.aMethod(); 
  }
}

如果您多次执行
new
,并且
delete[]
仅执行一次,则是的,您存在内存泄漏。它们需要平衡。使用工具(如)可以告诉您程序是否(以及在何处)存在内存泄漏。valgrind在MS Windows平台上不工作。如果我运行此代码,会发生什么情况?我不敢在我的电脑上运行它,但我尝试了一个在线的,它停止后抛出一个坏的_alloc@TitoneMaurice当前位置这正是您自己的计算机上将发生的情况。它完全无害。您的程序将崩溃,然后您的操作系统将回收内存。@TitoneMaurice,系统将在几秒钟内耗尽您进程的内存。。。。这是一件非常好的事情,你很快就失败了!您不希望软件出现后期故障。@Benjamin Lindley抱歉,操作系统将回收内存?我原以为它会泄漏,在下次系统启动之前不会被释放。@TitoneMaurice谢谢,这里有人刚刚告诉我valgrind.org进行泄漏检测。valgrind在你的情况下不起作用,因为你的
main()
@cwschmidt中有一个无休止的循环,静态分析器可以工作。-检测无限循环。:-。。。需要补充的是,当两者都失败时,调试器应该通过:-)@WhiZTiM-Sure,但建议只使用valgrind。Valgrind本身并没有意识到无休止的循环,它将一直运行到“内存不足”。即使没有静态代码分析器,一个好的程序员也会在本例中检测到无止境的循环。