문제
비쥬얼 스튜디오에서 CPP
파일을 실행하는 도중 Expression: is_block_type_valid(header->_block_use)
라는 메세지와 함께 에러가 발생했다.
검색을 해보니 힙메모리에서 참조할 수 없는 데이터를 참조하려고 할 때 발생하는 문제였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
class Person
{
private:
char* name;
int age;
public:
Person(const char* myname, int myage)
{
int len = strlen(myname) + 1;
name = new char[len];
strcpy(name, myname);
age = myage;
}
void ShowPersonInfo() const
{
std::cout << "Name: " << name << std::endl;
std::cout << "Age: " << age << std::endl;
}
~Person()
{
delete[]name;
std::cout << "called destructor" << std::endl;
}
};
int main(void)
{
Person man1("MAN1 NAME", 29);
Person man2("MAN2 NAME", 22);
man2 = man1;
man1.ShowPersonInfo();
man2.ShowPersonInfo();
return 0;
}
- 위 코드에서
man1
이 호출 된 뒤 소멸하는데new
를 통해 선언 된name
을 메모리 해제시킨다. - 다음 호출 된
man2
도 마찬가지로 소멸하면서 소멸자를 호출하는데, 이 때man2
는 대입연산자에 의해man1
과 같은 메모리를 가르키게 되므로name
을 해제할 수 없게 되었다.
해결
- 얕은 복사가 이루어지며 발생한 문제이므로 대입연산을 진행할 때 깊은 복사를 할 수 있도록 지정하고 깊은 복사에 앞서 메모리 해제를 시킨다.
1
2
3
4
5
6
7
8
9
10
11
Person& operator=(const Person& ref)
{
delete[]name; // 메모리 누수를 막기 위한 메모리 해제
int len = strlen(ref.name) + 1;
name = new char[len];
strcpy(name, ref.name);
age = ref.age;
return *this;
}