C struct中的c ++字符串,是非法的吗?

Bin*_*hen 5 c++

struct run_male_walker_struct {
        string male_user_name;
        string show_name;
};
typedef struct run_male_walker_struct run_male_walker_struct_t;
Run Code Online (Sandbox Code Playgroud)

在另一个功能:

run_male_walker_struct_t *p = malloc(sizeof(struct run_male_walker_struct));
Run Code Online (Sandbox Code Playgroud)

问题,这是非法的吗?由于字符串是一个类,因此sizeof()无法确定其大小.

Bry*_*yan 5

不确定你在这里问的是什么......为了清楚起见,struct关键字是一个有效的C++名称,其功能几乎与class默认隐私相同.因此,如果您使用g ++编译并包含字符串库,那么这是一个有效的语句.

但是,调用malloc()只会给你内存,而不是实际构造该结构中的值.您可以通过调用它的默认构造函数来更恰当地实例化它.


sbi*_*sbi 5

这是非法的,但不是出于你的想法.

std::malloc()/ std::free()new/ 之间的区别在于delete后者将调用构造函数/析构函数,而前者则不会.表达方式

void* p = std::malloc(sizeof(run_male_walker_struct))
Run Code Online (Sandbox Code Playgroud)

将返回一个未初始化的内存块,其上没有调用构造函数.你不应该用十英尺的杆子触摸它 - 除了在它上面调用一个构造函数:

run_male_walker_struct* pw = new(p) run_male_walker_struct;
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你也必须反过来:

pw->~run_male_walker_struct();
Run Code Online (Sandbox Code Playgroud)

在你释放记忆之前:

std::free(p);
Run Code Online (Sandbox Code Playgroud)

但是,这就留下了为什么要这样做的问题.
执行此操作的唯一原因应该是您希望将内存分配与构造分开(例如,在池分配器中).但如果你需要它,它最好隐藏在一些界面后面.一个自然的将是超载newdelete 每班.另外,std::vector这是内部吗.