我们的代码涉及一个POD(Plain Old Datastructure)结构(它是一个基本的c ++结构,其中包含其他结构和POD变量,需要在开始时进行初始化。)
基于我的read,似乎:
myStruct = (MyStruct*)calloc(1, sizeof(MyStruct));
应将所有值初始化为零,如下所示:
myStruct = new MyStruct();
但是,当结构以第二种方式初始化时,Valgrind后来抱怨“当使用这些变量时,条件跳转或移动取决于未初始化的值”。我的理解是否存在缺陷,或者Valgrind是否存在误报?
答案 0 :(得分:95)
在C ++中,类/结构是相同的(就初始化而言)。
非POD结构也可以有一个构造函数,因此它可以初始化成员 如果您的结构是POD,那么您可以使用初始化程序。
struct C
{
int x;
int y;
};
C c = {0}; // Zero initialize POD
或者,您可以使用默认构造函数。
C c = C(); // Zero initialize using default constructor
C* c = new C(); // Zero initialize a dynamically allocated object.
// Note the difference between the above and the initialize version of the constructor.
// Note: All above comments apply to POD structures.
C c; // members are random
C* c = new C; // members are random (more officially undefined).
我相信valgrind正在抱怨,因为这就是C ++过去的工作方式。 (我不完全确定何时使用零初始化默认构造升级C ++)。最好的办法是添加一个初始化对象的构造函数(结构是允许的构造函数)。
作为旁注:
很多初学者都试图重视init:
C c(); // Unfortunately this is not a variable declaration.
// The correct way to do this is:
C c = C();
快速搜索“最令人烦恼的解析”将提供比我更好的解释。
答案 1 :(得分:2)
从你告诉我们的事实来看,这似乎是valgrind的误报。 new
()
语法应该对对象进行值初始化,假设它是POD。
结构的某些子部分是否可能实际上不是POD并且阻止了预期的初始化?您是否能够将代码简化为仍然标记valgrind错误的可用示例?
或许你的编译器实际上并没有对POD结构进行初始化。
在任何情况下,最简单的解决方案是根据struct / subparts的需要编写构造函数。
答案 2 :(得分:1)
您需要初始化结构中的所有成员,例如:
struct MyStruct {
private:
int someInt_;
float someFloat_;
public:
MyStruct(): someInt_(0), someFloat_(1.0) {} // Initializer list will set appropriate values
};
答案 3 :(得分:1)
我写了一些测试代码:
#include <string>
#include <iostream>
#include <stdio.h>
using namespace std;
struct sc {
int x;
string y;
int* z;
};
int main(int argc, char** argv)
{
int* r = new int[128];
for(int i = 0; i < 128; i++ ) {
r[i] = i+32;
}
cout << r[100] << endl;
delete r;
sc* a = new sc;
sc* aa = new sc[2];
sc* b = new sc();
sc* ba = new sc[2]();
cout << "az:" << a->z << endl;
cout << "bz:" << b->z << endl;
cout << "a:" << a->x << " y" << a->y << "end" << endl;
cout << "b:" << b->x << " y" << b->y << "end" <<endl;
cout << "aa:" << aa->x << " y" << aa->y << "end" <<endl;
cout << "ba:" << ba->x << " y" << ba->y << "end" <<endl;
}
g ++编译并运行:
./a.out
132
az:0x2b0000002a
bz:0
a:854191480 yend
b:0 yend
aa:854190968 yend
ba:0 yend
答案 4 :(得分:0)
由于它是一个POD结构,你总是可以将它memset为0 - 这可能是初始化字段的最简单方法(假设这是合适的)。
答案 5 :(得分:0)
在我看来,这是最简单的方法。可以使用大括号“ {}”来初始化结构成员。例如,以下是有效的初始化。
struct Point
{
int x, y;
};
int main()
{
// A valid initialization. member x gets value 0 and y
// gets value 1. The order of declaration is followed.
struct Point p1 = {0, 1};
}
在c ++中有关于结构的良好信息-https://www.geeksforgeeks.org/structures-in-cpp/