在同一个指针上多次使用“new”

时间:2015-04-17 21:31:26

标签: c++

当我做

之类的事情时会发生什么
   int * ptr = new int; 
   *ptr = 5;
   // ... do some stuff here
   ptr = new int; 
   // ... reuse ptr to do some other stuff

而不是

   int * ptr1 = new int; 
   *ptr1 = 5;
   // ... do some stuff here
   delete ptr1;
   int * ptr2 = new int; 
   // ... use ptr2 now

????

硬件级别是否会发生同样的事情?换句话说,在第一种情况下,ptr = new int;是否从其先前的指针/值对移开,以及那些旧值会发生什么?他们会被替换,他们只是漂浮在某个地方等等吗?

2 个答案:

答案 0 :(得分:9)

您的int *ptr只是一个存储地址的变量,仅此而已。

在您的第一个int * ptr = new int;之后,它包含动态分配的整数的地址。在您的第二个int * ptr = new int;之后,它包含另一个动态分配的整数的地址。

接下来发生的事情并不特别,唯一的问题是你没有调用delete所以分配给第一个整数的内存永远不会被释放。没有什么可以跟踪它,它的地址没有存储在任何地方,所以它将一直无用的分配空间,直到程序结束。

答案 1 :(得分:7)

在第一个例子中,指针被覆盖,但是它指向的对象仍然存在并且在#34;周围浮动。某处。这会导致memory leaking

如果在频繁使用的功能或循环中发生这种情况,您可能会轻易耗尽记忆力,存储您无法再也无法访问的值。

泄漏事实上是一个非常常见的错误。 good practice是通过使用shared_ptr等智能指针来避免它。它们跟踪使用次数,并在不再使用时自动释放对象。例如:

 shared_ptr<int> ptr = make_shared<int>();   // allocate an int
 *ptr = 5;
 // ... do some stuff here
 ptr = make_shared<int>();  // the old object is no longer used so deleted automatically
 // ... reuse ptr to do some other stuff