supper crazy!!!!你可以拷贝下来运行,如果正常告诉我,如果有解决方法告诉我

d_jt 2001-11-21 10:06:24
#include <vector>
#include <iostream>
using namespace std;

class A{
public:
A();
~A();
protected:
void* x;
};

A::A()
{
x=malloc(100);
}
A::~A()
{
free(x);
}
static void print(vector<double>& vector_)
{
for(int i = 0; i < vector_.size(); i++)
cout << vector_[i] << " ";
cout << endl;
}

void main()
{
vector <A> va;
A a;
A a1;
vector <double> b;
int tmp;
va.push_back(a);
tmp=va.capacity();
va.push_back(a1);
tmp=va.capacity();
// print(b);
}
...全文
83 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bdsc 2001-11-21
  • 打赏
  • 举报
回复
我们在没有把事情搞清楚以前,不要乱下结论:

主要看这一句:
va.push_back(a);
//什么意思:这里发生了拷贝构造(嘿嘿,你没有写拷贝构造,编译器给你一个/免费的/shallow copy的),就是产生了新的对象,有构造就会有析构,但是注意你却提供了析构?! 并且在析构函数里进行了内存管理。

结论:如果有保存指针的成员,要考虑自己写拷贝构造函数,以便处理,因为系统给你的拷贝构造函数处理指针只是简单地复制,此例中经过拷贝有两指针指到同一内存区(被free了两次,这就是出错的原因)。另外,如果写拷贝构造函数通常也要重载operator=

内存管理(指针)是程序员的噩梦!
d_jt 2001-11-21
  • 打赏
  • 举报
回复
看来bcb5比vc6好,我用的环境是vc6
MountLion 2001-11-21
  • 打赏
  • 举报
回复
BCB5
d_jt 2001-11-21
  • 打赏
  • 举报
回复
会出现对话框,让你重试或退出?你的编译环境是什么?
MountLion 2001-11-21
  • 打赏
  • 举报
回复
运行过了,好像没有什么不正常
d_jt 2001-11-21
  • 打赏
  • 举报
回复
没人理?
liao2001 2001-11-21
  • 打赏
  • 举报
回复
我初学C++,长了见识,谢谢 bdsc() ! 

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧