在struct (II)中初始化字符串对象

Initialize a string object in a struct (II)

本文关键字:初始化 字符串 对象 struct II      更新时间:2023-10-16

这是问题的后续问题,我有一个结构体,如

struct {
    int a;
    //other fields
    string s1;
    string s2;
} strMyStruct;

如果对象是其他人的malloc()并将其传递给我进行快速处理(在我负责的函数myFunc中),我将如何初始化所有成员?我如何确保在函数myFunc中,数值成员初始化为0,字符串成员初始化为空字符串?

strMyStruct *p = (strMyStruct *)malloc(sizeof(x1));
myFunc(p);

更新1

因为结构体的成员可能经常改变,我不希望我的代码引用任何单独的成员。

根据@BillLynch的建议,您需要使用placement new。您可以通过使用

之类的内容使他的建议更安全。
std::unique_ptr<strMyStruct, placement_deleter> uptr = new(p) strMyStruct;

where placement_deleter

struct placement_deleter {
   void operator()(strMyStruct *pointer) const {pointer->~strMyStruct()};
}

这是个糟糕的主意。您真的应该用new而不是malloc()来分配这个对象。

但是,如果必须的话,可以使用placement new在预分配的内存块中分配一个c++对象:

strMyStruct *p = (strMyStruct *) malloc(sizeof(*p));
new(p) strMyStruct;

并确保在调用free():

之前调用析构函数。
p->~strMyStruct();
free(p);