使用new创建的带属性C++对象如何安全释放?delete能否清理所有成员内存?
问题1:代码写法是否正确?
这段代码存在语法错误,无法通过编译。
核心错误出现在b->letters_in_box = "Hello world";这一行:letters_in_box是类内定义的固定长度char数组成员,数组名本质是代表数组首地址的常量,不允许直接通过等号对整个数组赋值。如果要给该数组写入字符串,需要改为调用strcpy这类字符串拷贝函数:
// 替换原来的赋值行,注意要先引入<cstring>头文件才能用strcpy strcpy(b->letters_in_box, "Hello world");
使用时还要注意写入的字符串总长度(包括末尾的\0结束符)不要超过数组的80字节上限,避免出现缓冲区溢出问题。
问题2:delete b后成员内存是否会被一同清理?
修复上述语法错误后,执行delete b时,length和letters_in_box关联的内存都会被一同释放。
原因是这两个成员都是Box对象的内嵌成员,它们的内存完全包含在Box对象的整体内存布局中:你调用new Box时申请的堆内存,本身就已经覆盖了double类型成员和80字节char数组成员需要的全部空间,不存在额外独立的堆内存分配。因此delete b会将整个Box对象占用的堆内存全部归还给系统,两个成员的内存自然也会同步被回收。
注意:这里的“清理”指的是内存的使用权被回收,后续再通过野指针访问这部分内存属于未定义行为,并不代表内存上存储的内容会被自动擦除或置零。
内容的提问来源于stack exchange,提问作者Coder Alpha
相关产品推荐
相关产品推荐

