我想测试c ++中的删除可以做什么,所以写了以下内容:
#include <iostream>
#include <vector>
using namespace std;
class A{
public:
A(string s):a(s){}
string getS(){
return a;
}
private:
string a;
};
class B{
public:
B(string str):s(str){}
void setV(A a){
v.push_back(a);
}
string getS(){
return s;
}
private:
vector<A> v;
string s;
};
int main(){
A a("abc");
B* b = new B("cba");
b->setV(a);
cout<<b->getS()<<endl;
cout<<a.getS()<<endl;
delete b;
cout<<b->getS()<<endl;
cout<<a.getS()<<endl;
return 0;
}
我仍然得到以下输出:
cba
abc
cba
abc
看起来我仍然可以访问a和b的内存? 所以我的问题是 1.为什么我可以访问b,因为我已经删除了它? 2.为什么我有权访问a,因为b的析构函数被调用所以包含a的向量的内存应该是空闲的?
干杯
答案 0 :(得分:2)
自由功能不会清除或清零内存。它只是使它成为一个可以由内存管理器进行malloc编写的空闲块。
指针和结构都具有相同的值,并且在引用时将创建未定义的行为。抛出异常/错误或检索内部信息。
答案 1 :(得分:1)
1.为什么我可以访问b,因为我已经删除了它?
这是Undefined Behavior,所以一切皆有可能。它可能工作,可能不会,可能会出错,段错误,可能崩溃等等。
当您致电2.为什么我有权访问a,因为b的析构函数被调用所以包含a的向量的内存应该是空闲的?
a
时, b->setV(a);
被复制,因此vector
中的b
与a
无关。