关于指针的存在

时间:2013-07-03 22:18:15

标签: c++ class object pointers vector

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

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”指针在该函数之外指向“存在”的对象是什么?

7 个答案:

答案 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 ++没有任何类型的垃圾收集。使用mallocnew在堆上分配的任何内存将一直存在,直到使用freedelete手动释放。是的。

答案 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对象进行评估。