关于指针的存在
On existence of pointers
我有一个简单的问题。如果我有这样的代码:
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++没有任何类型的垃圾收集。使用malloc
或new
在堆上分配的任何内存都将存在,直到使用free
或delete
手动释放为止。是的。
是。代码示例中的矢量与您的问题完全无关。重要的是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
对象的评估。
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 构造函数 (C++) 中的 char 指针参数存在问题
- C++为什么我的指针选择排序中存在分段错误?
- 迭代时将指向differents类型的指针保存在std::向量中
- 如果模板中存在成员函数指针,如何获取该指针
- 指向类成员函数的指针中存在类型转换错误
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 是否存在将长整型转换为指针有效的情况
- C ++如何创建一个即使对象被覆盖也会持续存在的指针?
- 指向派生作品的基本指针,即使派生对象不存在
- 这个危险指针示例是否因为 ABA 问题而存在缺陷?
- 指向可能不存在的对象的指针向量
- 如果存在任何循环关系,我应该假设弱指针使用吗?
- 带有功能指针的Typedef:函数不存在
- 即使在返回值之前释放后,数据仍在指针中仍然存在
- C++尝试删除不存在的指针
- 如何使用shared_ptr确保指针的存在
- 构造函数中指针到指针的默认值存在问题
- 引用的初始化无效:指针和值之间存在差异
- 没有错误,但输出不正确.可能存在指针问题