在同一指针上多次使用 "new"
Using "new" multiple times on the same pointer
当我做类似的事情时会发生什么
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
相关文章:
- 在将 new 与指针一起使用时,创建数组的指定长度
- 在C++中,如果我可以直接将整数分配给指针而不使用"new",为什么要使用"new"?
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 删除使用 new 创建的 2D 或 3D 指针
- 基类指针:在哪里使用 new 和 delete
- 双指针在使用 new 时不调用对象构造函数
- 'new'和'='与指针的区别
- 哪些资源是由智能指针管理的,而它们的内存不是由new分配的
- (C++)如何在不导致 mem 泄漏的情况下将指针传递到分配了'new'的函数?
- C++:为什么可以在没有事先使用 new 的情况下在指向结构的指针上使用 delete?
- 为什么运算符"new"需要指针才能工作?
- 将指针返回使用New创建的数组数组
- "new"不会将内存分配给作为类的数据成员的指针
- 带"new"的指针和带"&variable"的指针有什么区别
- 基于索引的 alloca 返回的指针访问和"placement new"的效果
- 将内存分配给 2D 数组时,“new int*[rowCount];”的含义是什么?是 2D 数组,是指向数组的指针数组
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 使用 malloc 而不是 new 会导致 free():指针错误无效
- 如何将一系列指针分配给Usinig New
- 如何将`new`用于数组的指针