我有一个包含指向对象的指针的结构体对象。
我通过以下方式实例化结构体和指针对象:
struct Track
{
KalmanFilter* kalmanFilter; //Kalman filter for this track
....
};
我通过以下方式实例化结构体和指针对象:
Track track;
track.kalmanFilter = new KalmanFilter(contours[contour].centroid);
....
我会逐帧检查轨迹是否仍然有效。
//Temporary vector to hold alive tracks
std::vector<Track> tempTracks;
for(...)
{
//If track is valid save into temp tracks
if(tracks[track].deadTime <= deadTime) tempTracks.push_back(tracks[track]);
}
//Save all temp tracks back into tracks - this removes dead tracks that were in tracks
tracks = tempTracks;
一段时间后,我使用的微控制器内存不足。这是我的代码中唯一的指针,因此我非常确定KalmanFilter指针没有被删除。
到目前为止,我尝试在Track结构体中使用析构函数,但导致微控制器立即崩溃。
//Destructor frees up Kalman filter memory when the Track object goes out of scope
~Track()
{
if(kalmanFilter) delete kalmanFilter;
}
我尝试使用unique_ptr,但是我无法使代码编译通过。我找到的所有示例都在实例化unique_ptr指向的对象同时实例化该对象。在我的情况下,我认为我不能这样做。
如何正确处理这种情况?
谢谢
编辑
根据评论,似乎有两个主要观点。
在构造函数中分配内存
我已经重写了我的结构体
struct Track
{
Track(const Point& initialPosition) : kalmanFilter(initialPosition) {}
~Track() {}
KalmanFilter kalmanFilter; //Kalman filter for this track
};
我通过实例化来使用它
Track track(contours[contour].centroid);
这个正确吗?
寻找更好的删除轨迹方式
在循环过程中,有没有一种最好的方法可以从向量中删除对象而不会打乱索引?使用STL迭代器吗?
我实施了@M.M提供的解决方案,似乎有效。
tracks.erase(std::remove_if(tracks.begin(), tracks.end(), [&](Track const &t){return t.deadTime > deadTime;}));
struct
之外管理内存分配,最好将这种行为封装在类中,并且不要公开它。更好的方法是使用标准的C++容器或智能指针,并将内存分配和释放留给该成员处理。 - πάντα ῥεῖmyptr = std::make_unique<KalmanFilter>(contours[contour].centroid);
这会自动删除unique pointer的先前内容。 - jaggedSpireunique_ptr
是可能的。你可以简单地使用std::unique_ptr<int> n; n = std::make_unique<int>(3);
来实现。参考这个例子:https://ideone.com/WjJLdo - Tasfree
或delete
时是否为零/空气始终是不必要的。不要这样做,没有意义。 - Kuba hasn't forgotten Monica