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()无法确定其大小.
不确定你在这里问的是什么......为了清楚起见,struct关键字是一个有效的C++名称,其功能几乎与class默认隐私相同.因此,如果您使用g ++编译并包含字符串库,那么这是一个有效的语句.
但是,调用malloc()只会给你内存,而不是实际构造该结构中的值.您可以通过调用它的默认构造函数来更恰当地实例化它.
这是非法的,但不是出于你的想法.
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)
但是,这就留下了为什么要这样做的问题.
执行此操作的唯一原因应该是您希望将内存分配与构造分开(例如,在池分配器中).但如果你需要它,它最好隐藏在一些界面后面.一个自然的将是超载new和delete 每班.另外,std::vector这是内部吗.
| 归档时间: |
|
| 查看次数: |
7964 次 |
| 最近记录: |