#include <iostream>
#include <cstring>
using namespace std;
class Person
{
private:
char * name;
int age;
public:
Person(char * myname, int myage)
{
int len = strlen(myname) + 1;
name = new char[len];
strcpy_s(name, len, myname);
age = myage;
}
void ShowPersonInfo() const
{
cout << "이름: " << name << endl;
cout << "나이: " << age << endl;
}
~Person()
{
delete []name;
cout << "Called destructor!" << endl;
}
};
int main()
{
Person man1("hehehe", 24);
Person man2(man1);
man1.ShowPersonInfo();
man2.ShowPersonInfo();
return 0;
}
여기서 소멸자 부분에서 자꾸 문제가 생기는데요
소멸자를 위에처럼 선언하면 컴파일은 되는데 shallowcopyerror라면서 경고창이 뜨는데 초보라 도무지 모르겠네요
윤성우 책 예제 그대로 한거에 함수만 strcpy에서 strcpy_s로 바꿔준것 뿐인데
소멸자가 문제가 아니고
소멸자 문제가 아니라 복사생성자 문제임. 복사생성자를 정의해야 함
Person(Person& p) 이런거 만들어보셈
얕은 복사는 의도한건데
이게 얕은 복사에 의해 두개의 객체가 name이라는 문자열을 동시에 가리키게 되고
한 객체가 소멸하면서 그 name을 delete해버려서
남은 한 객체가 가리키던게 사라져서 오류가 뜨는건가요?
그럼 레퍼런스 카운팅 해줘야지
주소가 같으니까 두번지우자늠
아하! 감사합니다 이해됐어요!
string 냅두고 왜 cstring 쓰냐