在指向对象的指针上调用delete []时发生BLOCK_TYPE_VALID错误

时间:2012-03-02 09:27:43

标签: c++ oop memory-management dynamic

此代码在delete [] 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

这种行为有什么解释?在什么条件下必须调用“删除”而不是“删除[]”?

这是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 个答案:

答案 0 :(得分:1)

使用new Object()时,您应该使用delete

使用new Object[](和对象数组)时,应使用delete[]

答案 1 :(得分:1)

调用

delete[]来释放动态分配的数组:new type[]

调用

delete来释放动态分配的对象:new type

请参阅delete C++维基百科页面。

注意,如果destroy()函数被调用两次,则会尝试释放已delete d个对象,因为placard_NULL之后不是delete {1}}(如果在delete指针上调用NULL则不起作用。)

答案 2 :(得分:1)

  

这违反了我的课堂笔记,其中声明总是调用delete []而不是删除

不,那是错的。您必须将来电与newdelete配对,并致电new[]delete[]

注意: 但是现代C ++中你不应该这样做。请改用std::shared_ptrstd::unique_ptr。这通常是一个更安全的选择。对new/new[]的调用几乎总是包含在智能指针中,根本不需要delete。极少数例外。

答案 3 :(得分:0)

只有在使用operator new []进行分配时才使用operator delete []。此外,您应该尝试使用容器(vector,list,..)和智能指针(unique_ptr,shared_ptr)。