[英]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 *
(如果您不必处理Agent
, Agent *
就可以了)。 此时,您不必担心:当_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即可
除了它在类成员函数中并使用new
和delete
,这是C代码。 你不需要检查new
的结果(抛出分配错误),你不应该做你自己的动态数组(这就是std::vector
的用途),你不应该使用哑指针动态分配。
你想要的是std::vector< std::shared_ptr<Message> >
或者是boost的指针容器之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.