在同一指针上多次使用 "new"

Using "new" multiple times on the same pointer

本文关键字:new 指针      更新时间:2023-10-16

当我做类似的事情时会发生什么

   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;是否从其以前的指针/值对继续前进,这些旧值会发生什么?它们会被替换,它们是否只是漂浮在某个地方,等等?

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

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

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

在第一个示例中,指针被覆盖,但它指向的对象仍然存在,并且"浮动"在某处。 这会导致内存泄漏。

如果这种情况发生在常用函数或循环中,则很容易耗尽内存,存储无法也不再访问的值。

泄漏实际上是一个非常常见的错误。 一个好的做法是通过使用智能指针(如 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