복사 생성자 및 소멸자 집합

new와 malloc의 차이점

new와 malloc은 모두 동적으로 할당되지만 “무언가”가 다르다고 말했습니다. new의 경우 객체가 동적으로 생성되고 생성자가 동시에 자동으로 호출됩니다.


오물 소각로

이름이 동적으로 생성되고 문자열이 복사되면 동적으로 할당된 문자 배열 삭제는 언제 발생합니까? 특별히 삭제를 지정하지 않는 한 절대 자동으로 삭제되지 않습니다. 즉, 동적으로 할당된 이름은 디스크 공간에서 영원히 떠다닙니다. 위의 이름이 쌓이기 시작하면 메모리 누수라는 문제가 발생합니다. 이 문제를 해결하려면 소멸자를 사용해야 합니다! 소멸자는 인수를 사용하지 않으므로 오버로드되지 않습니다. 참고로 기본 생성자가 있었던 것처럼 별도의 생성자를 정의하지 않았더라도 소멸자도 기본 소멸자를 가지고 있습니다. 물론 기본 소멸자 내부에서는 아무 작업도 수행되지 않습니다. 클래스에 소멸자가 필요하지 않은 경우 별도의 소멸자를 작성할 필요가 없습니다.

복사 생성자

복사 생성자는 생성자(const classname& other)입니다. 다음과 같이 정의할 수 있습니다.


dog2의 경우 복사 생성자가 한 번 호출되고 다음의 경우 생성자가 한 번만 호출됩니다. 복사 생성자는 “빌드” 시에만 호출됩니다. 사실 기본 생성자 및 소멸자와 마찬가지로 C++ 컴파일러는 이미 기본 복사 생성자를 지원합니다.

기본 복사 생성자의 제한 사항

위의 코드를 실행해보면 알 수 있듯이 복사 생성자가 name과 같은 포인터를 가지고 있으면 이름을 해제하고 다시 해제된 메모리에 접근하여 삭제하는 문제가 있다. 따라서 복사 생성자에서 이름을 그대로 복사하지 말고 동적으로 다른 메모리에 할당하고 내용만 복사한다. 이와 같이 새로운 작업을 수행하여 콘텐츠를 복사합니다. 깊은 복사 이전처럼 그냥 할당 얕은 복사그것은 ~라고 불린다. 컴파일러에서 생성한 기본 생성자의 경우 얕은 복사만 수행할 수 있습니다. 따라서 위와 같이 딥 카피가 필요한 경우에는 직접 카피 생성자를 생성해야 합니다.

생각하다

하나
2
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#포함하다 <iostream>
수업 {
* str;
내부 렌;
공공의:
( 씨, 내부 N); // n개의 문자열로 정의됨 c
(끊임없는 * 에스);
(끊임없는 & 에스);
~();
비어 있는 추가_문자열(끊임없는 & 에스); // str 다음에 s 추가
비어 있는 복사 문자열(끊임없는 & 에스); // s를 str에 복사
내부 strlen(); // 문자열 길이 반환
};
::( 씨, 내부 N)
{
= N;
거리 = 새로운 (N+하나);
~을 위한 (내부= 0; 나 < N; ++나)
str(i) = 씨;
str(엔) = ‘\0’;
}
::(끊임없는 * 에스)
{
= 0;
~하는 동안 (s(렌))
++렌;
거리 = 새로운 (렌+하나);
strcpy_s(str, 렌 + 하나에스);
}
::(끊임없는 & 에스)
{
= s.len;
거리 = 새로운 (크기(s.str));
strcpy_s(str, 크기(s.str), s.str);
}
::~()
{
끄다 str;
}
비어 있는 ::추가_문자열(끊임없는 & 에스)
{
* 온도 = 새로운 (크기(스트) + 크기(s.str)하나);
~을 위한 (내부= 0; 나 < 렌; ++나)
{
시간(i) = str(i);
}
~을 위한 (내부= 렌; 나 <+ s.len; ++나)
{
시간(i) = s.str(i 렌);
}
tmp (렌 + s.len) = ‘\0’;
끄다 str;
거리 = tmp;
+= s.len;
}
비어 있는 ::복사 문자열(끊임없는 & 에스)
{
거리 = 새로운 (크기(s.str));
strcpy_s(str, 크기(s.str), s.str);
= s.len;
}
내부 ::strlen()
{
돌려 주다 렌;
}
CS