Невозможно создать новый wchar_t *

У меня этот оператор перегружен.
Моя программа вылетает при создании нового 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;
}
};

1

Решение

Этот код содержит, по крайней мере, две довольно очевидные проблемы:

  1. Вы выделяете данные, очевидно, используя new wchar_t[n] но вы отпускаете его с помощью delete p вместо того, чтобы использовать delete[] p,
  2. Вероятной причиной вашей проблемы является то, что вы объединяете две строки в память одной строки и затем выделить достаточно памяти для копирования данных.

Вы, вероятно, хотите что-то еще в соответствии с этим:

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: этот класс уже обеспечивает логику, возможно, в любом случае, в более эффективной форме.

3

Другие решения

Как говорит Дитмар (но немного подробнее наверное случилось за кадром)

1) звонок wcscat(data, s.data) переполнен конец буфера, на который указывает data, Если бы он не был переполнен, вам не нужно было бы выделять новый буфер, так как существующий был бы достаточно большим. Я ожидаю этого не достаточно большой.

2) Как следствие переполнения буфера, структуры данных, используемые распределителем памяти, уничтожаются. Это вызывает сбой при попытке выделить память. С таким же успехом это может привести к сбою, когда вы освобождаете память, или вообще не сбоите.

1

По вопросам рекламы [email protected]