나는 다음과 같은 코드가 있습니다게재 위치가 새로운 값으로 메모리가 제로가됩니까?
struct foo {};
void bar(foo *d) {
new(d) foo(*d);
}
이 표현 new(d) foo(*d)
개체를 떠나지 않습니다는 d
변화가 가리키는? 더 구체적으로 말하면, 클래스 foo
과 그 안에 재귀 적으로 포함 된 모든 객체가 사소한 복사 생성자 만 갖는 경우 위의 내용이 참일 경우 new(d) foo(*d)
은 *d
으로 변경되지 않습니까? 사실이 아닌 상황은 new
이 먼저 복사 생성자를 호출하기 전에 메모리를 초기화합니다. C++ 언어에 이와 같은 절이 있습니까?
편집 : 누군가가 이것을하고 싶어하는 이유는 드뭅니다. 예를 들어 CPU 메모리에서 GPU 메모리로 주소 공간을 통해 객체를 복사하는 것을 고려하십시오. 한 가지 해결책은 객체의 바이트 단위로 작업하는 것입니다. 이것은 많은 경우에 적용됩니다. 클래스에 가상 메소드가있는 경우 바이트 단위 복사는 vtable 포인터를 복사 한 다음 일부 CPU 메모리를 가리 킵니다. 위의 식을 new(d) foo(*d)
개체에 사용하여 컴파일러에서 vtable 포인터를 다시 설정하도록 할 수 있습니다.
http://stackoverflow.com/questions/2204176/how-to-initialise-memory- with-new-operator-in-c – m0skit0
당신이 이것을했다면 다소 혼란스러운 결과를 기대할 수 있습니다. –
왜 그럴까요? 비 - 배치 - '새로운 것'이 메모리를 제로로 만들 것을 기대 하시겠습니까? 생성자에서 명시 적으로 초기화되지 않은 POD 멤버에는 가비지 값이 있습니다. – jamesdlin