混淆内存损坏c++
confusion on memory corruption c++
class Test {
int a ;
int b ;
public :
Test() { }
Test(int x , int y) : a(x),b(y) { }
int getA() { return a ;}
int getB() { return b ;}
};
int main () {
list <Test *> mylist;
Test *t1 = new Test(10,20);
mylist.push_back(t1);
delete t1 ; //deleting the pointer
list <Test*> ::iterator it ;
for( it = mylist.begin() ; it != mylist.end() ; ++it ) {
Test *temp = (*it) ;
cout<<"taking data from list="<<temp->getB()<<endl;
}
return 0 ;
}
我对程序的输出感到困惑,在列表中插入指针后,我删除了指针。理想情况下,它应该给出分段错误,但它正在打印0。
delete t1 ; //deleting the pointer
这个delete
不是指针,而是这个指针指向的对象。
当您在std::list
中push_back
指针时,只复制指针,而不复制实际对象。
处理这一问题的两种标准方法是:
- 如果真的需要在容器中存储指针,那么
delete
就是对象,当你知道list
将不再使用时 - 避免这种问题的最常见的方法是具有CCD_ 6而不是CCD_
进行时
delete t1 ; //deleting the pointer
您删除的是指针指向的对象,而不是指针本身(按值复制到列表中(。
稍后获取指针是完全有效的操作
Test *temp = (*it) ;
无效的是使用指向已删除内存的指针,这将导致未定义的行为
cout<<"taking data from list="<<temp->getB()<<endl;
这意味着您可能会获得访问冲突或垃圾值,甚至是旧值,具体取决于内存的管理方式。
调用delete t1,只需调用对象的析构函数并释放内存。指针的值不变。它只是内存地址的值。
因此,您仍然可以访问t1所指向的内存块。但这种行为是不明确的。
通过调试,您可能会得到无效数据。因为一些调试堆实现使用字节模式填充释放的内存。在一个发布程序中,您可能会得到旧值和程序接缝以正确工作。
相关文章:
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用全局声明的向量时,C++双重释放错误/损坏
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 删除字符串后C++检测到堆损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 我可以写入关闭的套接字并强制纠正损坏的管道错误吗?
- 损坏的结构字符数组 - sqlite C++
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- zlib 膨胀在使用小缓冲区时会损坏
- 正在调试 malloc():新内存损坏
- 变量周围的堆栈'sortArray'已损坏