MyString 클래스를 정의 했으므로 이제 더하기 연산을 구현하려고합니다. 메모리 누수가 발생하는 것은 끔찍한 일이므로 소멸자에서 동적으로 할당 된 포인터를 릴리스하는 데주의를 기울였습니다. 내가 코드를 컴파일하고 실행하면동적 할당 포인터가있는 클래스에 연산자 재정의 적용
#include <iostream>
class MyString {
private:
int _size;
char* _str;
public:
MyString() {
_size = 0;
_str = nullptr;
}
MyString(int size, char* str) {
_size = size;
_str = new char[size + 1];
strcpy(_str, str);
}
~MyString() {
delete[] _str;
}
void print() {
std::cout << _str << std::endl;
}
friend MyString operator+(const MyString& lhs, const MyString& rhs);
};
MyString operator+(const MyString& lhs, const MyString& rhs) {
char* temp = new char[lhs._size + rhs._size + 1];
strcpy(temp, lhs._str);
strcat(temp, rhs._str);
MyString ret(lhs._size + rhs._size, temp);
delete[] temp;
return ret;
}
int main() {
MyString first(5, "first");
MyString second(6, "second");
MyString add = first + second;
first.print();
second.print();
add.print();
}
그러나 first.print()
및 second.print()
잘 인쇄되어 있지만 add.print()
는 쓰레기 값을 출력하며, 충돌 (디버그 어설 션 실패!).
출력 :
first
second
硼硼硼硼硼硼硼硼?흚 (and creashes :(..)
내가 주석과 소멸자를 실행하면 잘 인쇄하지만, 메모리 누수가 발생합니다. 왜 이런 일이 일어나는 걸까요? 연산자 오버라이드의 몇 가지 예를 살펴 보았지만이 동적 포인터 할당의 예는 발견하지 못했습니다.
모든 의견을 매우 높이 평가할 것입니다!
[3, 5 및 0의 규칙] (http://en.cppreference.com/w/cpp/language/rule_of_three)에 대해 알아야합니다. 3 가지 규칙을 구현하면 문제를 해결하는 데 충분합니다. –
감사! 기본 복사 생성자를 추가하면 매력처럼 잘 작동합니다. – youngminz