다음 코드는 컴파일을 할당하지만, 런타임시 오류를 전달 된 연속 메모리 블록을 삭제할 수 없습니다 :소멸자가
0x7ff87bc03200
0x7ff87bc03200
0x7ff87bc03200
0x10f9bcf64
123
abc
a.out(883,0x7fff7ee3d000) malloc: *** error for object 0x10f9bcf64:
pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
I :
# include <iostream>
# include <string.h>
class A {
public:
A() {}
A (int id, char * t_name) {
_id = id ;
name = new char [ strlen (t_name) + 1 ] ;
strcpy (name, t_name) ;
}
char *name ;
int _id ;
~A() { delete [] name ;}
} ;
int main() {
A a (1, "123") ;
A b ;
b = a ;
std::cout << static_cast < const void * > (a.name) << std::endl ;
std::cout << static_cast < const void * > (b.name) << std::endl ;
b.name = "abc" ; // b.name is directed to a different memory block
std::cout << static_cast < const void * > (a.name) << std::endl ;
std::cout << static_cast < const void * > (b.name) << std::endl ;
std::cout << a.name << std::endl ;
std::cout << b.name << std::endl ;
return 0 ;
}
이 같은 출력 그것이 말하는 이유를 이해하지 않습니다
0x10f9bcf64 : 포인터
할당되지 않은 해제되고
b.name
은 분명히 0x10f9bcf64
으로 지정되어 있으므로 더 이상 a
과 중복되지 않습니다!
이 문제가 어떻게 해결 될 수 있는지 궁금하십니까? 고맙습니다 !
의 규칙의 놀라운 세계에있어 3의 규칙. –
'b.name'은'new''d 메모리가 아니므로'delete'd가 될 수 없습니다 –