어떤 이유로 든 프로그램에서 동적 메모리 할당을 사용하지 않기로했습니다. 이것은 내 프로그램의 모든 변수가 정적이고 "새로운"생성자가 사용되지 않는다는 것을 의미합니다. 그러나 다음 코드는 충돌 및 스택 오버 플로우 예외 발생 : 내가하고 싶은 모든주고 X 자신과 다른 많은 변수를 포함하는 구조이다 VeryLargeObject의 기본값입니다, 분명히생성자가 항상 스택에서 호출되는 이유는 무엇입니까?
VeryLargeObject x; // Global variable -> static memory
void ResetTheObject()
{
x = VeryLargeObject();
}
을 다양한 복잡성을 가진 생성자 (초기화 작업이 상당히 필요함). 하지만 여기서 언어/컴파일러는 복사하기 전에 스택에서이 작업을 수행해야한다고 결정했으며 VeryLargeObject가 스택에 비해 너무 크기 때문에 프로그램이 중단됩니다. 나는이 문제에 대한 해결책을 발견했다 그러나
는 :
VeryLargeObject x;
void ResetTheObject()
{
new (&x) VeryLargeObject();
}
내가 전에 들어 본 적이없는, 아직 내가 원하는 정확히 않습니다. 이것은 "새로운 배치"입니다. 그것은 포인터에 의해 제공되는 이미 할당 된 (또는 단순히 정적 인) 메모리에서 생성자를 호출합니다.
제 질문은 해결책이 있기 때문에 호언 장담 : 왜 이것이 첫 번째 코드의 기본 동작이 아닙니까? 이 일을 덜 해킹하는 방법이 없다면 (즉, "new"라는 단어가 없어도 상관 없습니다), 그 이유는 무엇입니까? 또한 방금 제공 한 이유는 포인터를 다시 보내는 이유는 무엇입니까? 나는 C++이 훌륭한 언어라고 생각했지만, 이것은보기 흉하고 잘 못된 것 같습니다.
"어떤 이유로 든 프로그램에서 동적 메모리 할당을 절대로 사용하지 않기로했습니다." "나는 C++이 훌륭한 언어라고 생각했지만, 이것은보기 흉한 것 같고 잘 못된 것 같습니다." 너는 그들에게 btw btw 보이지 않니? – Slava
"* 이것은 내 프로그램의 모든 변수가 정적이라는 것을 의미합니다. *"아니, *는 * 의미하지 않습니다. 당신은 정말로 전역의 부하를 원하지 않습니다. – juanchopanza
그런 식으로 새 게재 위치를 사용하지 않아야합니다. 먼저 소멸자를 호출하여 원래의 객체를 파괴해야합니다. –