0

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

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”指针指向的对象会在这个函数之外“存在”吗?

4

7 回答 7

1

是的,它肯定会。但是,有两种方法可以定义“存在”:

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

2) 对象还在内存中吗?在这种情况下,再次是的。你永远不会释放对象。但是,如果您从未拥有 line this->dish_array.push_back(obj),那么该对象仍会在内存中,但您将无法引用它。这将是内存泄漏

于 2013-07-03T22:22:11.603 回答
0

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

但是,这与您在问题标题中提到的“指针的存在”无关。未命名对象的类型为Dish。它不是指针。obj它与您的指针无关。

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

于 2013-07-03T22:42:13.617 回答
0

是的。这是在免费存储中分配的副作用new,因此需要您应用手动清理。

于 2013-07-03T22:20:48.753 回答
0

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

于 2013-07-03T22:21:56.257 回答
0

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

于 2013-07-03T22:22:25.683 回答
0

C++ 没有任何类型的垃圾收集。在堆上分配的任何内存使用mallocornew将一直存在,直到手动释放,使用freeor delete。所以是的。

于 2013-07-03T22:23:01.200 回答
0

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

每个人都new应该有一个对应的delete,或者你应该把你得到的指针放入为你处理的东西(比如 a shared_ptr)。

于 2013-07-03T22:27:49.413 回答