Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化结构中的字符串对象(II)_C++_String - Fatal编程技术网

C++ 初始化结构中的字符串对象(II)

C++ 初始化结构中的字符串对象(II),c++,string,C++,String,这是我的后续问题,我有一个类似 struct { int a; //other fields string s1; string s2; } strMyStruct; 如果其他人将对象命名为malloc(),并将其传递给我进行快速处理(在我负责的函数myFunc中),我将如何初始化所有成员。如何在函数myFunc中确保数字成员初始化为0,字符串成员初始化为空字符串 strMyStruct *p = (strMyStruct *)malloc(sizeof(x1)

这是我的后续问题,我有一个类似

struct {
    int a;
    //other fields
    string s1;
    string s2;
} strMyStruct;
如果其他人将对象命名为malloc(),并将其传递给我进行快速处理(在我负责的函数
myFunc
中),我将如何初始化所有成员。如何在函数
myFunc
中确保数字成员初始化为0,字符串成员初始化为空字符串

strMyStruct *p = (strMyStruct *)malloc(sizeof(x1));
myFunc(p);
更新1


由于结构的成员可能会频繁更改,我不希望我的代码引用任何单个成员

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

但是,如果需要,我们可以使用new new来分配一个预先分配的内存块中的C++对象:

strMyStruct *p = (strMyStruct *) malloc(sizeof(*p));
new(p) strMyStruct;
并确保在调用
free()
之前调用析构函数:


按照@BillLynch的建议,您需要使用新的位置。你可以用一些类似的方法使他的建议更安全

std::unique_ptr<strMyStruct, placement_deleter> uptr = new(p) strMyStruct;

看看这是否有效…

不要!我们刚刚在另一个线程中告诉您不要像这样使用
malloc
,这不安全!如果您像我们在另一个问题中所说的那样初始化为
strMyStruct x1{}
,那么它将完全执行您所做的操作describing@CoryKramer,这听起来很疯狂,但我是那个可怜的家伙,通过了足够大的内存块,并确保在执行其他操作之前初始化了所有成员:-(.我不明白你为什么要这么做。如果你像我提到的那样实例化变量,值将完全符合你的要求运行,所有成员都已初始化!@CoryKramer,在前面的问题中,你的答案解决了我在声明本地对象时的问题。这里,我刚刚收到一块大小为的内存块结构,我如何调用构造函数?新的位置?这是一个可怕的想法。
unique\u ptr
至少…@Puppy:我不知道
unique\u ptr
如何解决这个问题。你能详细说明一下吗?第一步:make\u unique工厂为你处理所有这些垃圾。第二步:析构函数保证正确的清理。第三步:只移动保证安全,例如异常。简单地用
new
分配对象只是问题的一小部分。谢谢@Bill Lynch,你的解决方案有效!在允许的情况下,会在几分钟内接受它。它不适用于我需要对传递给我的内存块中的字段执行某些操作的情况,但我喜欢它,所以我投了赞成票:-)哦-你需要返回一个初始化的对象吗?哎哟。
std::unique_ptr<strMyStruct, placement_deleter> uptr = new(p) strMyStruct;
struct placement_deleter {
   void operator()(strMyStruct *pointer) const {pointer->~strMyStruct()};
}