2017-01-31 8 views
-2

Прежде всего, я не использовал C++ много времени, и вполне возможно, что этот вопрос очень прост, и его не стоит публиковать здесь. Во всяком случае, я не нашел никакого решения здесь или в другом источнике. Моя проблема заключается в следующем. Давайте предположим, что у нас есть класс A:инициализация и деструктор массива char

Class A 
{ 
    char* string; 
public: 
    char*& getString(){ return string; } 
    ~A() 
    { 
     if (string) 
      delete[] string; 
    } 
}; 

Я не могу изменить этот класс (это просто пример реального класса). Я хочу, чтобы установить поле string к значению:

int main() 
{ 
    A a; 
    a.getString() = new char[3]; 
    a.getString() = "Hi\0"; 
    return 0; 
} 

Этот код причины Debug Assertion Сбой при деструктор ~A() называется. Что я здесь делаю неправильно? Я действительно буду признателен за любое предложение о том, что я делаю неправильно.

EDIT: Кажется, этот оператор назначения здесь важен. На самом деле, я делаю такое задание:

int main() 
{ 
    A a; 
    char name[256]; 
    std::cin.getline(name, 256); 

    a.getString() = new char[strlen(name)]; 
    //actual version 
    strcpy_s(a.getString(), strlen(name), name); 
    //a.getString() = "Hi\0"; 
    return 0; 
} 
+4

Вы пытаетесь «удалить» статически выделенную строку (все строковые литералы статически распределены). Предположим std :: string и удалим ваш деструктор (std :: string использует RAII и автоматически обрабатывает его ресурсы). – Kevin

+0

Назначение не ведет себя по-разному в зависимости от текущего значения. Он всегда назначает новое значение и перезаписывает старый. – chris

+4

Ваш код сводится к 'delete []" Hi ";'. Вы пытаетесь «удалить» указатель, который не был назначен «новым». Вы также просачиваете предыдущее распределение. –

ответ

0

Этот код причины Debug Assertion обесточивания при деструктор ~ A() называется. Что я здесь делаю неправильно?

a.getString() = "Hi\0"; 

После этой линии, a.string указывает на строку буквального. Затем деструктор вызовет delete[] на указатель. Удаление строкового литерала имеет неопределенное поведение. Кроме того, ранее выделенный динамический массив просочился, поскольку указатель был перезаписан.

Решение заключается в удалении цитируемой строки.

 Смежные вопросы

  • Нет связанных вопросов^_^