我有一个简单的问题。如果我有这样的代码:
void Holder::Add()
{
Dish * obj = new Dish(this->screen_width, this->screen_height);
this->dish_array.push_back(obj);
}
其中 dis_array 声明如下:
vector <Dish*> dish_array;
“* obj”指针指向的对象会在这个函数之外“存在”吗?
是的,它肯定会。但是,有两种方法可以定义“存在”:
1)你可以在函数之外引用/使用它吗?在这种情况下,您可以,因为您的obj
值已放入dish_array
变量中,该变量现在存储对您创建的对象的引用。
2) 对象还在内存中吗?在这种情况下,再次是的。你永远不会释放对象。但是,如果您从未拥有 line this->dish_array.push_back(obj)
,那么该对象仍会在内存中,但您将无法引用它。这将是内存泄漏。
Dish
是的,您创建的类型的未命名对象new
将继续存在于函数之外。
但是,这与您在问题标题中提到的“指针的存在”无关。未命名对象的类型为Dish
。它不是指针。obj
它与您的指针无关。
一旦函数退出,指针obj
将消失,而Dish
它曾经指向的未命名对象将继续存在。您有责任确保指针的值在消失obj
之前存储在某处。obj
这样,您可以继续对Dish
您使用创建的未命名对象进行评估new
。
是的。这是在免费存储中分配的副作用new
,因此需要您应用手动清理。
是的。您使用new
关键字特别要求即使在返回后您的新实例Dish
仍保持活动状态(而不是垃圾) 。Holder::Add
它将保留在堆上,直到您使用delete
. 不要忘记在某个时候这样做,否则你会有内存泄漏!
是的 - 对 new 的调用返回一个指向已分配内存的指针。您正在将此指针的副本存储在您的vector
. 分配的内存将持续存在,直到您主动调用指针上的 delete。为避免代码中的内存泄漏,您需要遍历向量中的指针并在向量超出范围(无论可能在哪里)之前对它们调用 delete。当然,除非您在其他时间擦除它们并在那时对它们调用删除。当一个向量被销毁时,向量中的所有项目也被销毁 - 在这种情况下,您只有指针,因此即使指针被销毁,它们指向的内存也不会被释放,直到您对该指针调用 delete 。
C++ 没有任何类型的垃圾收集。在堆上分配的任何内存使用malloc
ornew
将一直存在,直到手动释放,使用free
or delete
。所以是的。
是的。您的代码示例中的向量与您的问题完全无关。重要的是new
关键字。您分配的对象new
保留在内存中,直到 1)您delete
的指针或 2)您的程序结束并且操作系统回收您的内存。如果您的向量超出范围并且所有指针都消失了,那么它们指向的对象仍然存在并且现在已经泄漏。
每个人都new
应该有一个对应的delete
,或者你应该把你得到的指针放入为你处理的东西(比如 a shared_ptr
)。