繁体   English   中英

删除指向struct的指针数组

[英]deleting an array of pointer to struct

我有以下结构:

struct Message {
    Agent *_agent;
    double _val;
};

和以下的Ptrs数组:

typedef Message* MessageP;
MessageP *_msgArr;
_msgArr = new MessageP[MAX_MESSAGES];

这是将Message插入数组的方法:

void Timing::AddMessage(Agent * const agentPtr, double val) {

    MessageP msgPtr = new Message;
    assert(msgPtr != 0);

    //assign values:
    (*msgPtr)._agent = agentPtr;
    (*msgPtr)._val = val;

    //add to messages array:
    assert(_msgArr != 0 && _waitingMsgs<MAX_MESSAGES);
    _msgArr[_waitingMsgs] = msgPtr;
    _waitingMsgs++;

}

我的问题是删除这个数组。 我想删除数组和所有已分配的结构。 如果我写:

delete [] _msgArr  

这会删除每个已分配的结构还是只释放为数组分配的内存?

正确的方法是使用for循环遍历整个数组并写入

delete _msgArr[i]

并最后删除[] _msgArr删除分配的数组?

谢谢!

是的,在调用数组上的delete[]之前,需要遍历所有元素并手动delete它们。

delete []将调用struct指针上的析构函数,它不会处理结构或_agent成员,它们本身指向内存。 你可以调用delete _msgArr[i]._agent然后在一个循环中delete _msgArr[i] ,它将处理Agent然后处理Message

首先,你需要知道谁应该摆脱Agent s,何时。 如果它们由另一个数据结构拥有,那么在摆脱_msgArr并循环_delete _msgArr[i]后跟delete [] _msgarr;时,你不应该delete [] _msgarr; 是你所需要的全部。

如果您确实还需要删除Agent ,则有三个合理的选择。

首先,您可以向Message一个将删除其_agent的析构函数。 它还应该有一个复制构造函数和赋值运算符,既可以传递所有权也可以复制,或者将它们定义为private因此任何使用它们的尝试都将是编译时错误。

其次,您可以将Agent *更改为智能指针,以便在Message消失时删除额外的内存。

第三,在摆脱数组时,你可以通过我上面建议的循环。

除非你有充分的理由保持代码C兼容,否则我建议你使用std::vector<boost::shared_ptr<Message> > ,并让Message包含一个boost::shared_ptr<Agent>而不是一个Agent * (如果您不必处理AgentAgent *就可以了)。 此时,您不必担心:当_msgArr超出范围时,所有内存都会正确清理。

不幸的是是的。 但是如果你要做很多事情,你可以用几行来简化这个事情。

#include <algorithm>
// might already exists in a boost header (i don't remember)
template <T>
void delete_func(T* e) {
    delete e;
}

// then, to delete your array :
std::for_each(_msgArr,_msgArr+MAX_MESSAGES, delete_func);
delete[] _msgArr;

但我建议不要这样做。 你可以使用带有auto_ptr或shared_ptr的std :: vector(取决于你的用例)。 所以你不必自己删除每个元素,因为auto_ptr会这样做。 您只需删除std :: vector即可

除了它在类成员函数中并使用newdelete ,这是C代码。 你不需要检查new的结果(抛出分配错误),你不应该做你自己的动态数组(这就是std::vector的用途),你不应该使用哑指针动态分配。

你想要的是std::vector< std::shared_ptr<Message> >或者是boost的指针容器之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM