“символ оператора*” проблема

Ниже кода, который, как ожидают, распечатает "kevin", Но, это печатает значение мусора. Я зарегистрировался в отладчике. Указатель, возвращенный "символом оператора*" вызов, недопустим. Какая-либо идея?

class Wrapper
{
private:
    char* _data;

public:

    Wrapper(const char* input)
    {
        int length = strlen(input) + 1;
        _data = new char[length];
        strcpy_s(_data, length, input);
    }

    ~Wrapper()
    {
        delete[] _data;
    }

    operator char*()
    {
        return _data;
    }
};

int main()
{
    char* username = Wrapper("kevin");
    printf(username);
    return 0;
}
9
задан Heath Hunnicutt 11 August 2010 в 19:12
поделиться

4 ответа

Проблема в том, что ваш объект Wrapper создается как временный и немедленно уничтожается. С помощью оператора char * вы возвращаете указатель на память, которая была удалена объектом Wrapper при его уничтожении.

Чтобы заставить его работать:

Wrapper wrapper("Kevin");
char* username = wrapper;
15
ответ дан 4 December 2019 в 08:50
поделиться

Этот оператор создает временный объект Wrapper :

char* username = Wrapper("kevin");

В конце оператора («полное выражение») объект Wrapper уничтожается. У вас остался болтающийся указатель (т.е. то, на что он указывает, было удалено).

Возврат указателя (или ссылки) на внутренние данные объекта обычно опасен, и его следует избегать, когда это вообще возможно. В любом случае, не думаете ли вы, что в мире существует достаточно строковых классов? Вам действительно нужно написать еще один?

1
ответ дан 4 December 2019 в 08:50
поделиться

Эта строка:

char* username = Wrapper("kevin");

создает безымянный объект Wrapper, который немедленно уничтожается, оставляя ваш указатель ни на что. Вам нужно либо дать объекту-оболочке имя, либо не писать такой код. Это будет работать:

Wrapper w("kevin");
char* username = w;
printf( "%s", username );
4
ответ дан 4 December 2019 в 08:50
поделиться

Возвращаемый вами указатель удаляется деструктором Wrapper, как только он выходит за пределы области видимости в конце первого оператора - перед printf.
В некоторых случаях эту ошибку можно скрыть, потому что память не может быть освобождена немедленно, и значение "выглядит" нормально, даже если оно больше не является действительным. Некоторые инструменты могут помочь обнаружить это.

4
ответ дан 4 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: