Kyl*_*yle 0 c++ memory destructor
我有一个继承自抽象类MapSite的类Room.Room的析构函数如下所示:
Room::~Room()
{
delete[] sides;
}
Run Code Online (Sandbox Code Playgroud)
MapSites的析构函数就是这样的:
virtual ~MapSite() {}
Run Code Online (Sandbox Code Playgroud)
构造函数如下所示:
Room::Room() : inventory(new Inventory)
{
for(size_t i = 0; i < 5; i++)
sides[i] == nullptr;
}
Run Code Online (Sandbox Code Playgroud)
房间的私人成员看起来像这样:
private:
int roomNumber = INVALID_ROOM_NUMBER; // Room number
MapSite *sides[5]; // Room roof/floor/wall/exits
std::string name; // Name of room
std::string description; // Room description
std::string lookDescription; // Extra description shown on look command
std::string filename = INVALID_ROOM_FILENAME; // Lua file associated with room
bool visited = false;
std::unique_ptr<Inventory> inventory;
Run Code Online (Sandbox Code Playgroud)
我收到了警告:
room.cxx: In destructor ‘virtual Room::~Room()’:
room.cxx:45:12: warning: deleting array ‘((Room*)this)->Room::sides’ [enabled by default]
delete[] sides;
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释这个警告意味着什么吗?我应该/如何抑制它?我从谷歌搜索中找不到任何东西.谢谢!
通常,您不应该delete[]使用语法声明的数组
T a[N];
Run Code Online (Sandbox Code Playgroud)
哪里T是某种类型,N是一些整数.
首先考虑如果在堆栈上分配数组会发生什么(自动存储持续时间).然后它将在其范围的末尾自动解除分配,因此您不应该调用delete它.
现在考虑a具有动态存储持续时间会发生什么.将数组a声明为数组类型时,无法动态分配数组.调用new为您提供指针,但您无法将该指针值分配给数组变量.所以a必须是动态分配对象的子对象.但在这种情况下,a将在创建完整对象时分配内存,并在销毁完整对象时释放内存.再次,无需手动管理内存a.
在另一方面,它可能是你想要delete的每个元素的数组sides,因为每个元素本身就是一个指针.该delete[]语法并没有做到这一点.你必须写
for (int i = 0; i < 5; i++) {
delete sides[i];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2787 次 |
| 最近记录: |