删除指针后,str 指针自身的占用空间可以存在
after delete pointer, the occupied space for the str pointer self can exist?
string *str=new string;
delete str;
删除对象后,str 指针自身占用的空间可以存在吗?
是的,当然。变量 str
的类型为 string *
仍在范围内。一旦退出其当前范围,它将不复存在。例如,在函数的末尾或包含这些指令的{ }
分隔块。
这就是为什么最好不要再指向曾经分配new string
的地址,现在它不再有效。现有内存指向有效内存或 NULL 总是好的。
string *str = new string;
delete str;
str = NULL;
请注意,在第三行之后,您现在可以询问"str 是否指向有效的内存位置?",即"我可以安全地取消引用它吗?"。
if (str != NULL) ...
另一方面,如果不将指针设置为 NULL,则无法执行此类检查。您应该记住,在删除指令之后,现在取消引用str是无效的,因此不这样做。显然,这是在招惹麻烦。
尽管正确,但这种代码(与删除匹配的新本地匹配,以及删除其目标内存位置后设置为 NULL 的任何活动指针(在将来更改时非常脆弱且容易出错。例如,如果函数不是那么简单,并且在新建和删除之间的路径中,您有条件和循环怎么办?如果将 str 作为参数传递给另一个函数怎么办?这个函数用指针做了什么:复制它,克隆它指向的对象...?
一种称为 RAII - 资源分配即初始化的技术(请参阅此问题(有助于创建防止内存泄漏和内存访问违规等类型的错误的设计。
注意:稍微直观一些,尽管在这个网站上建议了不太正统的RAII名称:UDSTMR - 使用析构函数语义来管理资源,或UTSTTC - 使用堆栈触发清理。看到这个答案。
删除运算符 C++ 做两件事:
- 调用对象的析构函数
- 将对象占用的内存部分标记为"空闲",以便以后可以将其重用于另一个对象。
保留一段时间,但几乎可以肯定的是,在某个时刻有人会覆盖它们,所以人们不应该依赖它们的存在和凝聚力。
存储在变量str
指针被保留,并且仍然指向内存的该部分。您可以重用此指针并通过再次调用运算符来分配另一个new
string
。
出于好奇,旧的DOS游戏《模拟城市》有一个bug,导致释放后使用释放的内存。由于该游戏非常受欢迎,Windows设计人员为此游戏准备了一个特定的规则,该规则允许它安全地使用已释放的内存,以便它可以从Windows中运行。
之后
delete str
str
仍然存在。这行代码释放str
指向的内存,因此您可以再次new
它。
int main()
{
string *str=new string;
delete str;
}
这样做的是,
创建一个名为 str
的容器,该容器能够指向字符串。现在,当您执行delete str
时,实际的字符串将被删除。但指针仍然可以指向该内存位置。(不过,您可能不被允许访问它(。指针的作用域直到main
}
,当您完成main
时,将被销毁(堆栈上释放的内存分配(
- 使用类指针重载C++命名空间函数模板专用化替代方法?
- 常量"C"占用的空间(以字节为单位)
- C++中是否有一个函数可以为您获取指向该节点的所有指针的地址空间
- 为什么QT的iOS组件会占用这么多磁盘空间?
- 为什么树结构比其节点的总和占用更多的空间
- 当编译时已知引用占用结构中的空间时,是否错过了优化?
- 创建指针会占用大量资源吗?
- 空向量占用的空间是否与指向当前设置为 nullptr 的类型的指针一样多
- 将空间分配给整数指针时出错
- 使用全局命名空间限定符和指向数据成员的指针
- 指向命名空间内的成员函数的指针
- 如何使一种类型的STL对只占用另一种类型的空间"empty struct"?
- 如何表示指向地址空间开头的指针
- 删除内存空间后,指针的值保持不变还是更改?对象内容是否将被更改
- 清除stdin缓冲区(内存占用空间)
- 5字节QByteArray的内存占用空间.5字节的quint64或QByteArray存储效率更高吗
- 为什么指针占用未分配给它的内存
- 为什么没有成员变量的C++类会占用空间
- 删除指针后,str 指针自身的占用空间可以存在
- 为什么向量指针占用这么多内存?