2010-12-03 2 views
0

나는 연산자 오버로딩에 대한 느낌을 얻으려고하고 있지만 문제가 발생했다. 이 프로그램은 단지 두 개의 문자열을 상실하는 의미입니다. 이미이 작업을 수행하는 다른 방법이 있다는 것을 알고 있지만, 나는 놀고 싶었습니다. 나는 다음과 같은 오류가 발생합니다 :클래스 내부에서 오버로드 + 디버그 어설 션이 실패합니다!

파일 : dbgdek.cpp 라인 : 52 _ASSERTE (_BLOCK_TYPE_IS_VALID (pHead-> nBlockUse));

삭제 []를 (를) 사용하는 것과 관련이 있다고 생각합니다. 제발 내가 정말로 붙어 있도록 도와주세요.

#include <iostream> 
using namespace std; 

class list{ 
public: 
char *value; 
int size; 
list(int s){size=s; allocmem();}; 
~list(){delete [] value;}; 
list operator+(list); 
private: 
void allocmem(void); 
}; 

void list::allocmem(void){ 
value=new char[size]; 
} 

list list::operator+(list a) 
{ 
list t(a.size+size); 
for (int i=0; i<a.size; i++){ 
     t.value[i]=a.value[i]; 
} 
for (int i=a.size; i<t.size; i++){ 
     t.value[i]=a.value[i-a.size]; 
} 
return t; 
} 

int main() 
{ 
    list a(2),b(2),c(4); 
    a.value[0]='a'; 
    b.value[0]='b'; 
    a.value[1]='c'; 
    b.value[1]='d'; 
    c=a+ b; 
    for (int i=0; i<c.size; i++){ 
      cout<<c.value[i]; 
    } 
    system("pause"); 
    return 0; 
} 

도와주세요!

답변

0

당신은이 일을해야합니다

  1. 통과 기준이 아닌 값으로 데이터의 복사본을 생성하는 복사 생성자를 만듭니다.

operator +() 값으로 전달하고 있습니다. 그러면 사본이 전달됩니다 (원하는 것은 아니며 참조를 전달하려고합니다). 그러나 복사 생성자를 만들지 않았기 때문에 복사 된 객체는 기본 멤버 별 복사본을 얻습니다. 이제 2 개의 객체가 동일한 포인터를 갖습니다. 첫 번째는 잘 삭제하고 두 번째 객체에는 잘못된 포인터가 있습니다.

1

첫 번째 경고 기호 : 클래스의 소멸자는 delete을 처리하지만 클래스는 복사 생성자 또는 복사 할당 연산자를 정의하지 않습니다.

Rule of Three을 참조하십시오.

임시 소멸자가 호출 될 때 의도하지 않게 개체의 임시 복사본을 만들고 엉망으로 만들고있을 가능성이 있습니다.

1

소멸자에서 중복 된 메모리 삭제를 피하기 위해 할당 연산자 (list::operator=(list const&))와 클래스의 복사 생성자 (list::list(list const&))를 정의해야합니다. 이러한 함수를 정의하지 않으면 컴파일러는 기본적으로 생성 된 버전을 사용하며 기본적으로 목록 객체의 비트 복사본을 만듭니다. 이는 목록의 인스턴스를 복사 한 후에 두 인스턴스가 모두 같은 포인터 값을 가지므로 복제 삭제의 원인이되므로 재앙입니다.

0

char* 문자열로 직접 작업하는 대신 std::string을 사용하지 않으시겠습니까? 그런 다음 메모리 관리 문제에 대해 걱정할 필요가 없습니다 (이 경우 복사 생성자를 구현하지 않아 두 번 삭제됨). 같은 것이 가장 직역에서 : 거의 확실 일반적으로 string 이상을 사용하여 더 나은 구현 있다는 것을

class list 
{ 
public: 
std::string value; 
int size; 
list(int s){size=s; allocmem();} 
~list(){} 
list operator+(list); 
private: 
void allocmem(void); 
}; 


void list::allocmem(void){ 
value.resize(size); 
} 

주 (예 : size 멀리 갈 수있다). 또한 모든 속성을 가지고 있지 않아야합니다. public.

관련 문제