此代码在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_;
};
答案 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 []而不是删除
不,那是错的。您必须将来电与new
和delete
配对,并致电new[]
和delete[]
。
注意:强>
但是现代C ++中你不应该这样做。请改用std::shared_ptr
或std::unique_ptr
。这通常是一个更安全的选择。对new/new[]
的调用几乎总是包含在智能指针中,根本不需要delete
。极少数例外。
答案 3 :(得分:0)
只有在使用operator new []进行分配时才使用operator delete []。此外,您应该尝试使用容器(vector,list,..)和智能指针(unique_ptr,shared_ptr)。