当C++的类嵌套在了结构体时,对结构体清理是否调用类的析构?

Zip Zou 2015-03-19 08:34:41
我有一个类,嵌套在了结构体中作为一个元素,例如:
struct Test{
Person p;//Person为一个类
char* s;}
那么这时候我定义:
Test* t = new Test;
delete[] t;
这个时候是否p的空间也会被析构?我把对对象的构造过程省去了,就这个意思吧,求解?
...全文
523 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wb_rock 2015-03-31
  • 打赏
  • 举报
回复
把test也定义为class,写上析构函数
Mi_Bo 2015-03-21
  • 打赏
  • 举报
回复
会调用析构的,因为析构会释放成员p,但是成员s不会释放
  • 打赏
  • 举报
回复
苏叔叔 2015-03-20
  • 打赏
  • 举报
回复
在delete的时候,会相应delete每一个成员 1.普通类型成员或者说内置类型,直接free 2.对于类类型,先调用类的析构函数,再free 这种区别,可参考: http://blog.csdn.net/zhangxiangdavaid/article/details/43889365
Zip Zou 2015-03-20
  • 打赏
  • 举报
回复
引用 5 楼 fly_dragon_fly 的回复:
这应该是两个问题 1 p是属于的test的一部分,delete时空间就被释放了 2. 在调用test的析构会自动调用p的析构
额,嗯哪,那么当结构体对象在构造的时候也会好像不会调用类的构造?我也测试了一次,并没有自动构造类的对象,而需要在结构体的构造函数中手动调用类的构造函数?
fly_dragon_fly 2015-03-20
  • 打赏
  • 举报
回复
这应该是两个问题 1 p是属于的test的一部分,delete时空间就被释放了 2. 在调用test的析构会自动调用p的析构
xiaocai0001 2015-03-20
  • 打赏
  • 举报
回复
会析构,一个简单的小程序就可以验证,给Person加上一个析构函数并输出
#include <iostream>

class Person
{
public:
    ~Person() { std::cout << "Person destructor called ..." << std::endl; }
};

struct Test
{
    Person p;
    char * s;
};

int main()
{
    Test * t = new Test;
    delete t;
    return 0;
}
$ g++ test.cpp -o test ; ./test
Person destructor called ...
xiaojunjun1202 2015-03-20
  • 打赏
  • 举报
回复
肯定会的。 但是 char* s; s 的释放要自己写。
勤奋的小游侠 2015-03-20
  • 打赏
  • 举报
回复
自己写个测试代码输出一下不就知道了吗? struct和class只有默认访问属性的区别。其它是没有区别的,struct就是class
aijie099 2015-03-20
  • 打赏
  • 举报
回复
我觉得 你在结构体里的对象 没有 实体 只是一个指针 不存在夕构。你在具体用的时候还得 构造实体
一根烂笔头 2015-03-20
  • 打赏
  • 举报
回复

#include <iostream>
#include <cstdlib>
using namespace std;
#define C_CODE
class Person
{
public:
    ~Person() { std::cout << "Person destructor called ..." << std::endl; }
};

struct Test
{
    Person p;
    char * s;
}Test;

int main()
{
#ifdef C_CODE

    cout << "c code" << endl;
    struct Test * t = (struct Test*)malloc(sizeof(struct Test));
    free(t);

    struct Test var;

#else
    cout << "c++ code" << endl;
    Test * t = new Test;
    delete t;
#endif
    return 0;
}
无论C风格还是C++风格,无论静态还是动态,都要执行对象的构造和析构
一根烂笔头 2015-03-20
  • 打赏
  • 举报
回复
无论是嵌入一个类当中还是嵌入C风格的结构体中,对象创建时自动执行构造,消亡时自动执行析构操作。因为C风格的结构体在C++中认为成员全为public属性的类。
sublimepan 2015-03-19
  • 打赏
  • 举报
回复
不是你申请的空间,都会释放,是你自己申请的空间或资源,你要自己释放。
yshuise 2015-03-19
  • 打赏
  • 举报
回复
当然了

64,637

社区成员

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

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