关于析构函数以及定位new表达式的一些问题

ck_chuyun 2003-08-23 02:58:24
class Account
{
public:

Account()
: _name( "default" ), _balance( 0.0 ), _acct_nmbr( 0 )
{}

Account(const char* name)
: _balance( 0.0 ), _acct_nmbr( 0 )
{
_name = new char[ strlen(name) + 1 ];
}

// 在析构函数中使用了delete
~Account(){ delete [] _name; }

private:

char *_name;
double _balance;
int _acct_nmbr;
};

char *arena = new char[ sizeof(Account) ];

int main()
{
Account *ptr = new(arena) Account( "Quasimodo" );

// 1、为什么析构函数中的delete操作符没有把底层的堆存储区也删除了?
ptr->~Account();

// 2、为什么下面的表达式没有删除堆存储区?
delete [] arena;

Account *pts = new(arena) Account( "Esmerelda" );

system( "PAUSE" );
return 0;
}

关于第一个问题,我想既然ptr被赋值为与arena相关联的地址,那么析构函数中的
delete操作符在删除ptr->_name的同时也就是把堆存储区删除了,不知道这样理解
的对不对?

第二个问题,delete [] arena好像没有起作用,按理说,删除后给arena分配的存储
区已经不存在了,用pts指向它应该会出错,可却没有,是编译器的问题吗?我用了
Dev C++和VC 7.0,结果pts还是能指向arena分配的存储区(应该不存在了啊)!!!
...全文
53 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lifanxi 2003-08-23
  • 打赏
  • 举报
回复
Sorry,没有看仔细。
您说的是第二个new,我以为是第一个了。第二个是错的,因为delete 已经把arean所指的内存释放了。
ck_chuyun 2003-08-23
  • 打赏
  • 举报
回复
关键是delete已经释放了所指的内存,所以是危险的吧
lifanxi 2003-08-23
  • 打赏
  • 举报
回复
为什么要出错?这不是一个很正常的placement new吗?
这个句子用于在arena的所指的内存上创建一个Account对象,会调用Account对象的构造函数。如果arena已经正确的分配了内存的话,一点也不危险。
lifanxi 2003-08-23
  • 打赏
  • 举报
回复
为什么要出错?这不是一个很正常的placement new吗?
这个句子用于在arena的所指的内存上创建一个Account对象,会调用Account对象的构造函数。如果arena已经正确的分配了内存的话,一点也不危险。
ck_chuyun 2003-08-23
  • 打赏
  • 举报
回复
Account *pts = new(arena) Account( "Esmerelda" );

那这个语句为何没有出错?这样是不是很危险
lifanxi 2003-08-23
  • 打赏
  • 举报
回复
这个程序中其实有两次内存分配,一次是对Account对象的分配,而Account对象建立时又对它内部的_name成员分配内存。Account析构函数中的delete是释放了后者的内存,前者的内存是在delete [] arena时释放的。
delete[] arena是用于释放Account对象所占的空间的,所以是有用的。delete只是释放arena指针所指的内存,不是释放arena所占的内存,所以delete后arena的值并不会变,这就形成了所谓的“野指针”。比较好的风格就是在delete后把指针置为0,避免野指针可能导致的一些问题。
thrillers 2003-08-23
  • 打赏
  • 举报
回复
析构函数和delete的作用是不一样的,就如同构找函数和new不一样是一样的



delete将内存中的数据删除,而系构函数将这块内存归还系统

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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