C ++调用删除不释放内存?

时间:2015-08-04 02:58:26

标签: c++ memory-management destructor

我想测试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的向量的内存应该是空闲的?

干杯

2 个答案:

答案 0 :(得分:2)

自由功能不会清除或清零内存。它只是使它成为一个可以由内存管理器进行malloc编写的空闲块。

指针和结构都具有相同的值,并且在引用时将创建未定义的行为。抛出异常/错误或检索内部信息。

答案 1 :(得分:1)

  

1.为什么我可以访问b,因为我已经删除了它?

这是Undefined Behavior,所以一切皆有可能。它可能工作,可能不会,可能会出错,段错误,可能崩溃等等。

  

2.为什么我有权访问a,因为b的析构函数被调用所以包含a的向量的内存应该是空闲的?

当您致电a时,

b->setV(a);被复制,因此vector中的ba无关。