Правильное использование new/delete
От: ice71crew Россия  
Дата: 29.07.03 12:17
Оценка:
Помогите мне плZ, а то совсем мозги уже потекли.
Имеем простой до безобразия строковой класс XString.
Почему при создании объекта этого класса способом
XString s = "string";
вызывается второй конструктор XString(LPSTR string),
а не просто XString, с последующим вызовом перегруженного
оператора = ?
И самое главное, почему при присваивании одного
объекта этого класса другому вообще вылетает Debug
Assertion Fault, хотя присваивается то все нормально.
Насколько я понимаю, я что-то очень нехорошее замутил
с new/delete. Далее приведен исходник.


Visual C++ 5.0 — DEBUG

//-----------------------------------------------------------------------------------
#include <windows.h>



class XString
{
public:
    char *Text;
    WORD Size;
    
    
    XString();
    XString(LPSTR string);
    ~XString();

    void SetText(LPSTR string);
    
    void operator =(LPSTR string);
};




XString::XString()
{
    Text = NULL;
    Size = 0;
}



XString::XString(LPSTR string)
{
    Text = NULL;
    Size = 0;
    SetText(string);
}



XString::~XString()
{
    if(Text)
    {
        delete Text;
        Text = NULL;
    }
}



void XString::SetText(LPSTR string)
{
    int i = 0;
    while(string[i])    i ++;
    Size = i + 1;

    if(Text)    delete Text;
    Text = new char[Size];    //Вот эта строчка вызывает fault при присваивании

    for(i = 0; i < Size; i ++)
        Text[i] = string[i];
}



void XString::operator =(LPSTR string)
{
    SetText(string);
}



void main()
{
    XString str1 = "Just a text string\r\n";
    XString str2 = "Another text string\r\n";

    str1 = str2;    //А это само присваивание ;))
}


Исправлена подсветка синтаксиса. -- ПК.
-=Ай=-
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.