У меня этот оператор перегружен.
Моя программа вылетает при создании нового wchar_t
массив.
myObject &operator += (const myObject &s) {
wchar_t *cat = wcscat(data, s.data);
int len = wcslen(cat);
wchar_t *test = new wchar_t[len + 1]; //this is killing!
wcscpy(test, cat);
delete data;
data = test;
return *this;
}
Кто-нибудь знает, что происходит?
РЕДАКТИРОВАТЬ полное определение класса
class myObject
{
private:
wchar_t *data;
public:
myObject() { data = 0; }
~myObject() { delete data; }
myObject &operator += (const myObject &s) {
wchar_t *cat = wcscat(data, s.data);
int len = wcslen(cat);
wchar_t *test = new wchar_t[len + 1];
wcscpy(test, cat);
delete data;
data = test;
return *this;
}
};
Этот код содержит, по крайней мере, две довольно очевидные проблемы:
new wchar_t[n]
но вы отпускаете его с помощью delete p
вместо того, чтобы использовать delete[] p
,Вы, вероятно, хотите что-то еще в соответствии с этим:
myObject &operator += (const myObject &s) {
size_t len = wcslen(this->data) + wcslen(s.data);
std::unique_ptr<wchar_t[]> tmp(new wchar_t[len + 1]);
wcscpy(tmp.get(), this->data);
wcscat(tmp.get(), s.data);
delete[] this->data;
this->data = tmp.release();
return *this;
}
На самом деле, я думаю, что вы хотите использовать std::wstring
: этот класс уже обеспечивает логику, возможно, в любом случае, в более эффективной форме.
Как говорит Дитмар (но немного подробнее наверное случилось за кадром)
1) звонок wcscat(data, s.data)
переполнен конец буфера, на который указывает data
, Если бы он не был переполнен, вам не нужно было бы выделять новый буфер, так как существующий был бы достаточно большим. Я ожидаю этого не достаточно большой.
2) Как следствие переполнения буфера, структуры данных, используемые распределителем памяти, уничтожаются. Это вызывает сбой при попытке выделить память. С таким же успехом это может привести к сбою, когда вы освобождаете память, или вообще не сбоите.