Home Expression: is_block_type_valid(header->_block_use)
Post
Cancel

Expression: is_block_type_valid(header->_block_use)

문제

비쥬얼 스튜디오에서 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;
}

Reference

네이버 블로그

This post is licensed under CC BY 4.0 by the author.

OpenCV 히스토그램

OpenCV 산술 연산