c++ 구조체 char* 메모리 관련
글쓴이: jyh305 / 작성시간: 목, 2020/11/19 - 7:12오후
현재 C++ 을 이용하여 dll을 만들고 있으며 c/c++ 예제 코드에서 동작해야합니다.
이전까지는 문제가 없었는데 구조체 문자열 관련해서 코멘트가 와서 어느 부분이 문제인지 고민중입니다.
기존에는
struct { char* name 생성자(const char* Name, ,) { this->name = new char[strlen(Name)+1]; strcpy_s()/ strcpy() } 복사생성자(const struct& copy) { this->name = new char[strlen(copy.name)+1] strcpy_s() / strcpy() } 소멸자 { if(name!=nullptr) { char* tmp = name; name = nullptr; delete[] tmp; } } }
이런 형태로 작성되어있었습니다.
그런데 여기서 저 문자열 관련 코드에서 메모리 누수? 오버플로? 가 생각되는 오류가 있다고 합니다.
저도 전달 받은거라서 증상에 대해서 정확히 못들었습니다만,
(반복 작업 시에 자동적으로 delete 한다? 라고 들은 것 같습니다)
저런 구조체에서 char* 로 인해 메모리 관련 문제가 생길 수 있을까요?
예상 되어지는 오류가 있나요?
(참고 : c 예제코드에서 돌릴려고 하다보니 string 보다는 char* 을 사용했습니다.)
Forums:
1. 코드에 검열관이 다녀갔나요? 여러 군데 지워져
1. 코드에 검열관이 다녀갔나요? 여러 군데 지워져 있네요.
남에게 보이고 싶지 않은 게 있어서 지우는 거야 자유입니다만, 코드는 컴파일 가능한 형태로 올리는 게 좋습니다.
안 그러면 컴파일 가능한 형태의 답변을 받기 어렵거든요.
2. 답변은 짧게 요약하면, Copy assignment operator를 따로 만들어주지 않은 부분이 문제가 됩니다.
https://en.cppreference.com/w/cpp/language/copy_assignment
아 죄송합니다
죄송합니다 코드가 불완전한건
퇴근하고 생각나는대로 적다보니 이렇게 되었습니다. 보충하겠습니다
copy assignment operator 가 복사생성자 아닌가요??
복사 생성자는 copy constructor고요.
복사 생성자는 copy constructor고요.
https://en.cppreference.com/w/cpp/language/copy_constructor
그 둘을 잘 구분해 줘야 합니다. 대개의 경우 copy constructor와 copy assignment operator 중 하나를 explicit하게 구현할 필요가 있는 경우, 다른 하나도 구현해 줘야 할 필요가 있을 가능성이 높습니다.
(destructor와도 같은 관계가 있어서, 셋을 묶어서 "3의 법칙"이라고 부르기도 합니다. C++11부터는 두 개가 더 추가되어서 5의 법칙입니다.)
감사합니다
C++11 기준으로 작성중인데 5의 법칙까지 만족시켜야 하는군요
정말 감사합니다!
댓글 달기