关于指针的存在

On existence of pointers

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

我有一个简单的问题。如果我有这样的代码:

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"指针指向的对象是否存在于该函数之外?

是的,肯定会的。然而,有两种方法可以定义"存在":

1) 你能在函数之外引用/使用它吗?在这种情况下,您可以,因为您的obj值已放入dish_array变量中,该变量现在存储对您创建的对象的引用。

2) 这个物体还在记忆中吗?在这种情况下,再次是的。您从未释放对象。但是,如果您从未使用过this->dish_array.push_back(obj)行,则对象仍在内存中,但您将无法引用它。这将是内存泄漏

是。这是new的副作用,它在空闲存储中进行分配,因此需要应用手动清理。

是。您使用new关键字特别请求即使在Holder::Add返回后,也要保持Dish的新实例处于活动状态(而不是垃圾)。它将保留在堆中,直到您使用delete释放它的内存。不要忘记在某个时候这样做,否则你会有内存泄漏!

C++没有任何类型的垃圾收集。使用mallocnew在堆上分配的任何内存都将存在,直到使用freedelete手动释放为止。是的。

是。代码示例中的矢量与您的问题完全无关。重要的是new关键字。使用new分配的对象将保留在内存中,直到1)指针delete或2)程序结束,操作系统回收内存。如果你的向量超出了范围,所有指针都消失了,那么它们指向的对象仍然存在,现在已经泄露了。

每个new都应该有一个相应的delete,或者你应该把你得到的指针放进一个能帮你处理的东西里(比如shared_ptr)。

Yes-对new的调用返回一个指向已分配内存的指针。您正在vector中存储此指针的副本。分配的内存将一直存在,直到您在指针上主动调用delete为止。为了避免代码中的内存泄漏,您需要对向量中的指针进行迭代,并在向量超出范围之前(无论指针在哪里)对其调用delete。当然,除非你在另一个点上删除它们,并在那个点上调用delete。当一个向量被销毁时,向量中的所有项也会被销毁——在这种情况下,你只有指针,因此即使指针被销毁,它们所指向的内存也不会被释放,直到你对该指针调用delete。

是的,使用new创建的类型为Dish的未命名对象将继续存在于函数之外。

然而,这与你在问题标题中提到的"指针的存在"无关。未命名对象的类型为Dish。它不是指针。它与您的obj指针没有任何关系。

一旦函数退出,指针obj将消失,而它用来指向的未命名的Dish对象将继续存在。您有责任确保obj指针的值在obj消失之前存储在某个位置。这样,您就可以继续维护对使用new创建的未命名Dish对象的评估。