Ошибка BLOCK_TYPE_VALID при вызове delete [] для указателя на объект - PullRequest
0 голосов
/ 02 марта 2012

Этот код возвращает ошибку при удалении [] placard_;Звоните

void Protestor::destroy() { //Free's caller Protestor's dynamic memory
    delete [] placard_;
}

Этот код не.

void Protestor::destroy() { //Free's caller Protestor's dynamic memory
    delete placard_;
}

Это идет вразрез с моими примечаниями к классу, в которых говорится, что ВСЕГДА звоните

delete []

, а не

delete

Чем объясняется такое поведение?При каких условиях должен вызываться «delete» вместо «delete []»?

Вот определение для классов Protester и Sign.

class Protester
{
  public:
    Protester(string name, string signSlogan, int signHeight, int signWidth,
              int rcmp_file = 0 );
    string getName() const;
    Sign getPlacard() const;
    void changePlacard( string newSlogan, int newHeight, int newWidth);
    void setRCMPfile(int RCMP_file);
    int getRCMPfile() const;

    //Big Three
    Protester(const Protester& other); //Copy Constructor
    ~Protester(); //Destructor
    Protester& operator= (const Protester& other); //Assignment Constructor


private:
    // name of the Protester
    string name_;

    // a sign the protester is wielding
    Sign* placard_;

    // the RCMP file number tracking this person (zero means no RCMP report)
    int rcmp_file_;

    //Big Three Helper Functions
    void copy(const Protester& other); //Performs Deep Copy of const Protester&
    void destroy(); //deletes [] placard_
                    //sounds better then cleanup, in my humblest of opinions.
};

class Sign
// a class representing information about signs/placards
{
public:
    // constructor to initialize sign text and dimensions
    Sign(string statement, int height, int width);

    // return sign text
    string getStatement() const;

    //return sign height
    int getHeight() const;

    //return sign width
    int getWidth() const;

    // change sign text
    void setStatement(string statement);

    // change sign dimensions
    void setSize(int height, int width);

private:
    // the text of the sign
    string statement_;

    // dimensions of the sign
    int height_;
    int width_;
};

Ответы [ 4 ]

1 голос
/ 02 марта 2012

Это идет вразрез с моими примечаниями к классу, в которых ВСЕГДА вызывается удаление [], а не удаление

Нет, это не так.Вы должны сопоставить вызовы new и delete и вызовы new[] и delete[].

Примечание: Но это не так, как в современном C ++.Вместо этого используйте std::shared_ptr или std::unique_ptr.Обычно это гораздо более безопасный выбор.Вызовы new/new[] почти всегда должны быть заключены в интеллектуальный указатель, а delete вообще не требуется.Очень немногие исключения.

1 голос
/ 02 марта 2012

delete[] вызывается для освобождения динамически размещенного массива: new type[]

delete вызывается для освобождения динамически размещаемого объекта: new type

См. deleteC ++ Страница Википедии.

Обратите внимание, что если функция destroy() вызывается дважды, будет предпринята попытка освободить уже delete d объект, поскольку placard_ не NULL ed послеdelete (если по указателю NULL вызывается delete, это не имеет никакого эффекта).

1 голос
/ 02 марта 2012

Когда вы используете new Object(), вы должны использовать delete

Когда вы используете new Object[] (и массив объектов), вы должны использовать delete[]

0 голосов
/ 02 марта 2012

Вы используете оператор delete [] только тогда, когда вы используете оператор new [].Кроме того, вы должны попытаться использовать контейнеры (vector, list, ..) и умные указатели (unique_ptr, shared_ptr).

...