C ++ 구조체를 초기화하는 적절한 방법
우리 코드는 POD (Plain Old Datastructure) 구조체 (처음에 초기화해야하는 다른 구조체와 POD 변수가있는 기본 C ++ 구조체입니다.)
내가 읽은 것을 기반으로 한 것 같습니다.
myStruct = (MyStruct*)calloc(1, sizeof(MyStruct));
다음과 같이 모든 값을 0으로 초기화해야합니다.
myStruct = new MyStruct();
그러나 구조체가 두 번째 방법으로 초기화 될 때 Valgrind는 이러한 변수를 사용할 때 "조건부 점프 또는 이동이 초기화되지 않은 값에 따라 달라집니다"라고 나중에 불평합니다. 내 이해에 결함이 있습니까, 아니면 Valgrind가 오탐을 던지고 있습니까?
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{}; // Latest versions accept this syntax.
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 ++가 0 초기화 기본 구성으로 언제 업그레이드되었는지 정확히 모르겠습니다.) 가장 좋은 방법은 객체를 초기화하는 생성자를 추가하는 것입니다 (구조체는 생성자가 허용됨).
참고로
많은 초보자가 init를 중요하게 생각합니다.
C c(); // Unfortunately this is not a variable declaration.
C c{}; // This syntax was added to overcome this confusion.
// The correct way to do this is:
C c = C();
"Most Vexing Parse"에 대한 빠른 검색은 내가 할 수있는 것보다 더 나은 설명을 제공 할 것입니다.
당신이 우리에게 말한 바에 따르면 그것은 valgrind에서 거짓 긍정으로 보입니다. new와 구문 ()은 POD 가정하고, 물체의 가치를 초기화한다.
구조체의 일부 하위 부분이 실제로 POD가 아니며 예상되는 초기화를 방해 할 수 있습니까? valgrind 오류를 표시하는 게시 가능한 예제로 코드를 단순화 할 수 있습니까?
또는 컴파일러가 실제로 POD 구조 값을 초기화하지 않을 수도 있습니다.
어쨌든 가장 간단한 해결책은 구조체 / 하위 부분에 필요한 생성자를 작성하는 것입니다.
테스트 코드를 작성합니다.
#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
구조체에있는 모든 멤버를 초기화해야합니다. 예 :
struct MyStruct {
private:
int someInt_;
float someFloat_;
public:
MyStruct(): someInt_(0), someFloat_(1.0) {} // Initializer list will set appropriate values
};
POD 구조체이기 때문에 항상 0으로 memset 할 수 있습니다. 이것은 필드를 초기화하는 가장 쉬운 방법 일 수 있습니다 (적절하다고 가정).
참고 URL : https://stackoverflow.com/questions/5914422/proper-way-to-initialize-c-structs
'Programing' 카테고리의 다른 글
| SVN 역 병합? (0) | 2020.11.02 |
|---|---|
| 내 javascript regex.test ()가 교대 결과를 제공하는 이유 (0) | 2020.11.02 |
| if 문에서 && 연산자 사용 (0) | 2020.11.01 |
| Carthage로 Cartfile에서 하나의 라이브러리 만 업데이트하는 방법은 무엇입니까? (0) | 2020.11.01 |
| JS 객체에 대한 JSON 문자열 (0) | 2020.11.01 |