Почему я получаю исключение памяти при удалении символа * - PullRequest
2 голосов
/ 23 декабря 2011

Я пытаюсь написать свой собственный класс строки (чтобы я мог узнать больше) и при этом я заметил, что столкнулся с проблемой удаления данных char, когда программа закрывает деструктор строки и при удалении данных будет куча ошибок

#include <string.h>

template<typename T>
class String
{
protected:
    T* mData;

public:
    String(const T* data);
    ~String();
};

template<typename T>
String<T>::String(const T* data)
{
    if(data != NULL)
    {
        mData = new T[strlen(data)];
        strcpy(mData, data);
    }
}

template<typename T>
String<T>::~String()
{
    if(mData != NULL)
    {
        delete [] mData;
        mData = 0;
    }
}

int main(void)
{
    String<char> Test("Test");

    return(0);
}

Ответы [ 3 ]

5 голосов
/ 23 декабря 2011
 mData = new T[strlen(data)];
        strcpy(mData, data);

Вы выделяете один элемент слишком мало, strcpy копирует нулевой завершающий байт, а также строку

0 голосов
/ 24 декабря 2011

Вы должны быть осторожны с оператором new, вызывающим исключение в вашем конструкторе. Если это произойдет, вы должны убедиться, что указатель данных инициализирован для nullptr, в противном случае будет вызван деструктор и попытаться удалить какой-либо случайный адрес.

#include <cstring>

template<typename T>
class string {
    protected:
        T * data_;
    public:
        string(T const * data);
        ~string();
};

template<typename T>
string<T>::string(T const * data)
try {
    if(!data) data_ = 0;
    else {
        data_ = new T[std::strlen(data) + 1];
        std::strcpy(data_, data);
    }
} catch(...) {
    data_ = 0;
}

template<typename T>
string<T>::~string() {
    delete[] data_;
}

int main() {
    string<char> test("test");
    return 0;
}
0 голосов
/ 24 декабря 2011

Вы должны использовать функции "memcpy" и "memset" вместо таких, как strcpy:

http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...