C++ 删除指向的对象

C++ 删除指向的对象,c++,memory-leaks,iteration,C++,Memory Leaks,Iteration,我有一个for循环,我正在使用指针动态设置一个对象。我想在下一个实例中重复使用相同的指针,但我担心内存泄漏 myPointer *obj; for (int i = 0; i <= 10; i++) { obj = new Object(i); obj->doSomeStuff(); } myPointer *obj; for (int i = 0; i <= 10; i++) { obj = new Object(i); obj->do

我有一个
for
循环,我正在使用指针动态设置一个对象。我想在下一个实例中重复使用相同的指针,但我担心内存泄漏

myPointer *obj;
for (int i = 0; i <= 10; i++) {
    obj = new Object(i);
    obj->doSomeStuff();
}
myPointer *obj;
for (int i = 0; i <= 10; i++) {
    obj = new Object(i);
    obj->doSomeStuff();
    delete obj;
}
myPointer*obj;
对于(int i=0;i doSomeStuff();
}
我是否应该在
for
语句末尾将obj设置为
NULL
delete obj
在这种情况下似乎只会导致严重问题


编辑:我在类中添加了一个重置方法来重置私有变量的值,以便进行另一次传递。似乎工作得更好/更快。

将指针设置为
NULL
可确保内存泄漏,因为现在无法
删除
allcoated对象。如果
删除obj
导致问题,则您必须如果您需要修改以修复这些问题,否则您将出现内存泄漏。(除非对象以某种方式删除自身。)

您需要
删除
的任何内容,否则您将泄漏它

Object* obj;
for (int i = 0; i <= 10; i++) {
    obj = new Object(i);
    obj->doSomeStuff();
    delete obj;
}

实际上,在这种情况下正确的做法是删除指针,否则将导致内存泄漏

myPointer *obj;
for (int i = 0; i <= 10; i++) {
    obj = new Object(i);
    obj->doSomeStuff();
}
myPointer *obj;
for (int i = 0; i <= 10; i++) {
    obj = new Object(i);
    obj->doSomeStuff();
    delete obj;
}
myPointer*obj;
对于(int i=0;i doSomeStuff();
删除obj;
}

要添加,
新对象(i);
上创建一个新的未命名的
对象
,这是作为程序员委托您管理的内存空间

obj=newobject(i);
中,通过记录对象在内存中的位置,即指针
obj
中的地址,您将保持对象的句柄

然后代码进入第二个循环,
新对象(i)
的位置覆盖
obj
中记录的位置

现在,您已经丢失了第一个
对象的位置。因为您不知道它在哪里,所以不可能清除它,从而导致内存泄漏

myPointer *obj;
for (int i = 0; i <= 10; i++) {
    obj = new Object(i);
    obj->doSomeStuff();
}
myPointer *obj;
for (int i = 0; i <= 10; i++) {
    obj = new Object(i);
    obj->doSomeStuff();
    delete obj;
}
在Cyber的例子中,可以通过简单地在堆栈上创建来避免堆中所有这些乱七八糟的东西。堆栈是为您管理的内存。您可以阅读更多关于它的信息

现在,如果您坚持使用指针并在堆上分配,那么您需要像这里的其他人所建议的那样,学会自己清理

赛博再次提到,这个想法是为你拥有的每一个
新的
设置一个
delete
。要
delete
某个东西,你需要它的位置,这就是为什么你需要一个指针来记住它的位置,直到它被删除为止

您还需要正确的类型,这样我们就可以知道我们应该
删除的内存块有多大。请注意,您的指针与您尝试删除的对象的类型不同

另外,请不要误会,指针只与一起工作。它们也与堆栈上的对象一起工作

objectobj(10);
对象obj2(20);
对象*指向对象的指针\&obj=&obj;//对象的地址
指向_obj=&obj2;//的指针现在存储obj2的地址
我希望我对你有所帮助


注意:设置
obj
,一个指向
NULL
nullptr
(C++11)的指针,基本上意味着指针没有存储任何对象的位置。

您应该描述“严重问题”。这不是一个精确的描述。为什么要动态分配?为什么要在下一个实例中重复使用同一指针?“严重问题”导致崩溃,变量私有变量在下一次传递时没有重置。不可避免地会有一些例外。如果'obj->doSomeStuff()'将'this'的所有权转移到另一个容器、线程或API回调,该回调要求将对象的生存期扩展到函数调用之外,按描述直接删除它是不好的。将参数传递到对象的上下文是什么?你是指我为什么写这行
object obj{I}
?我只是使用
初始化\u列表
语法来调用构造函数,就像您在示例中使用
对象(I)
一样。