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