从其成员函数中删除对象
Deleting object from its member function
我们有一个 container
对象和一个 item
对象。 Item
是 container
的一部分。 item
成员函数调用 container
函数删除 item
。
当 container
函数删除 item
对象 returns 到 item
成员函数时会发生什么?听起来它会导致未定义的行为。这是 delete this;
的更详细的案例吗?
编辑:
class Item
{
Container* itemContainer;
std::string itemName;
void check(void)
{
bool condition = false;
// check some condition (not relevant to the question)
if (!condition)
{
itemContainer->CheckFailed(itemName);
}
}
}
class Container
{
std::vector<Item*> itemList;
void checkFailed(std::string)
{
Item* targetItem;
//find item by name
delete targetItem;
}
}
所以我的问题是:如果 condition
为假并且调用 Container
中的 checkFailed
会发生什么(targetItem
是 item
从哪里Check()
函数被调用)。
是的,这是 delete this 的一个更复杂的案例,一旦 Container::checkFailed()
returns 到 Item::check()
this*(和 Item 实例的 any/all 成员)已经消失,没有未定义的行为就不能使用。
行为定义明确(或未定义)。
更具体地说,如果对象是使用运算符 new
创建的,并且在 delete
d 之后不再使用(例如,指向它的 [现在悬挂] 指针是取消引用,访问非静态成员,调用非静态成员函数等)。
如果对象在删除后被使用,则行为未定义。
我们有一个 container
对象和一个 item
对象。 Item
是 container
的一部分。 item
成员函数调用 container
函数删除 item
。
当 container
函数删除 item
对象 returns 到 item
成员函数时会发生什么?听起来它会导致未定义的行为。这是 delete this;
的更详细的案例吗?
编辑:
class Item
{
Container* itemContainer;
std::string itemName;
void check(void)
{
bool condition = false;
// check some condition (not relevant to the question)
if (!condition)
{
itemContainer->CheckFailed(itemName);
}
}
}
class Container
{
std::vector<Item*> itemList;
void checkFailed(std::string)
{
Item* targetItem;
//find item by name
delete targetItem;
}
}
所以我的问题是:如果 condition
为假并且调用 Container
中的 checkFailed
会发生什么(targetItem
是 item
从哪里Check()
函数被调用)。
是的,这是 delete this 的一个更复杂的案例,一旦 Container::checkFailed()
returns 到 Item::check()
this*(和 Item 实例的 any/all 成员)已经消失,没有未定义的行为就不能使用。
行为定义明确(或未定义)。
更具体地说,如果对象是使用运算符 new
创建的,并且在 delete
d 之后不再使用(例如,指向它的 [现在悬挂] 指针是取消引用,访问非静态成员,调用非静态成员函数等)。
如果对象在删除后被使用,则行为未定义。