std :: string one과 비슷한 클래스 문자열을 구현했습니다. 소멸자가 호출 될 때 문제가 있습니다. 필드 길이 필드에 할당 된 문자 길이가 있습니다. 이 클래스입니다 :세그멘테이션 오류를 일으키는 소멸자
나는 할당 연산자를 사용하는 경우class indexException:public std::exception
{
public:
virtual const char* what()
{
return "Index is either too long, or negative";
}
};
class string
{
public:
static const unsigned int length_max=100;
string(const char* field=NULL)
{
if(field!=NULL)
{
const unsigned int length=strlen(field);
this->field=new char[length+1];
this->length=length;
for(unsigned int i=0;i<=length;i++)
this->field[i]=field[i];
}
else
{
this->field=NULL;
length=0;
}
}
string(string& str)
{
string(str.field);
}
~string()
{
if(length>0)
delete field;
}
char& operator[] (int i) const throw()
{
try
{
if(i<0 || i>=(int)length)
throw indexException();
}
catch(indexException& e)
{
std::cerr << e.what() << std::endl;
}
return field[i];
}
string& operator=(const char* field)
{
const unsigned int length=strlen(field);
if(this->length>0)
delete this->field;
this->field=new char[length];
this->length=length;
for(unsigned int i=0;i<length;i++)
this->field[i]=field[i];
return *this;
}
string& operator= (const string& str)
{
if(this!=&str)
*this=str.field;
return *this;
}
operator char*()
{
return field;
}
friend std::ostream& operator<< (std::ostream& out, string& str);
friend std::istream& operator>> (std::istream& in, string& str);
public:
unsigned int length;
char* field;
};
std::ostream& operator<<(std::ostream& out, string& str)
{
out << str.field;
return out;
}
std::istream& operator>> (std::istream& in, string& str)
{
char temp[string::length_max];
in >> temp;
str=temp;
return in;
}
,이 세그먼트 오류가 발생하지 않습니다. 하지만 그것은 직접적인 원인이됩니다. 나는 방법에 대해 설명합니다
int main(int argc,char** argv)
{
string str="hi";
string str2=str;
return 0;
}
는 할당 연산자 오버로딩에 중단 점을 퍼팅, 나는의 할당은 운영자가 세그먼트 오류가 발생하지 않습니다 것을 깨달았다. 문제는 메인을 종료 할 때 발생합니다. 소멸자를 제거하면이 세분화 오류가 발생하지 않지만 왜이 문제가 발생하는지 알 수 있습니다.
편집 : 문제가 어디 내가 이해했다. 제안 사항을 따랐지 만 여전히 세그먼트 분할 오류가 발생합니다. 그러나 지금은 소멸자 방식에 더 이상 충돌하지 않지만, 할당 연산자 오버로딩에 :
string& operator=(const char* field)
{
unsigned int length=0;
if(field!=NULL)
length=strlen(field);
else
field="";
if(this->length>0)
delete[] this->field;
this->field=new char[length+1];
this->length=length;
strcpy(this->field,field);
return *this;
}
문제는 내가 this-> 필드를 삭제하면되고, 디버거가 중지됩니다. 분할 고장 예 :
string str("hi");
string str2=str;
이 분할 잘못이야 STR2가 초기화되지 않기 때문에 그것의 suppone 일으키고, 길이가 정의되지 않은 값을 갖는다. 내가 대신 할 경우 어떤 분할 fault.Why
string str("hi");
string str2;
str2=str;
없다
? 이string str2;
또한 생성자를 호출, 또는 WAS은 "="연산자 우선 순위를 가지고 있다는 것입니다 : 나는 호출하면 생각? 어떻게 해결할 수 있습니까?
PS : 나는 또한 복사 생성자와 같은 다른 일을 변경했습니다. 전체 코드는 여기에 있습니다 : http://pastebin.com/ubRgaVr8
가 해결 : 내가 복사 생성자를 변경 허용 응답에 제안 :
string(const string& str)
{
length=str.length;
field=new char[str.length+1];
memcpy(field,str.field,length+1);
}
복사 생성자가 그처럼 작동하지 않습니다. 그것은'string (string const & rhs) : string (rhs.field) {}'이어야합니다. 그러나 이것은 C++ 11의 새로운 기능이며 아직 널리 지원되지 않습니다. –
new []를 사용하여 할당하려는 경우 delete []를 사용하여 삭제하려고합니다. –
나는 delete 대신에 delete []를 사용하고 Vyktor가 말했듯이 if 조건을 변경하려고 시도했다. 여전히 세분화 오류가 발생한다. –