我们有一个container
对象和一个item
对象。 Item
是container
的一部分。 item
成员函数调用container
函数删除item
。
当删除container
对象的item
函数返回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
为假且来自checkFailed
的{{1}}被调用会发生什么(Container
是来自{targetItem
的{{1}} 1}}函数被调用)。
答案 0 :(得分:1)
是的,这是一个更详细的删除此案例,一旦Container::checkFailed()
返回Item::check()
,此*(以及Item实例的任何/所有成员)都消失了,如果没有未定义则无法使用行为。
答案 1 :(得分:1)
行为定义明确(或未定义)。
更具体地说,如果对象是使用运算符new
创建的,并且在delete
d之后未使用(例如,[now dangling]指针被取消引用,则行为是明确定义的,访问非静态成员,调用非静态成员函数等。
如果在删除对象后使用该对象,则行为未定义。