gpt4 book ai didi

c++ - 如果 std::vector 在释放时按值返回?

转载 作者:太空宇宙 更新时间:2023-11-04 15:47:54 28 4
gpt4 key购买 nike

我无法理解在以下情况下如何释放 C++ std::vector 容器

void DoSomething()
{
cv::Point ** curves;
int * curve_sizes;
num_curves = m_curves.size(); //member variable holdings curves
curves = new cv::Point*[num_curves];
curve_size = new int[num_curves];

std::vector<cv::Point> cur_points;
for(int i = 0; i < num_curves; ++i)
{
cur_points = CreatePolyPoints(m_curves[i]);
curves[i] = &cur_points[0];
curve_sizes = cur_points.size();
}

cv::fillPoly(m_roi, curves, curve_sizes, num_curves, ... );

//Clear the dynamic data
// Do i do aything here?
delete [] curves;
delete [] curve_sizes;
}

std::vector<cv::Point> CreatePolyPoints(Curve curve)
{
std::vector<cv::Point> points;

//Do work here here
while(something)
{
cv::Point cur_point;
points.push_back(cur_point);
}

return points;
}

提前致谢。如果有人对我的目标感兴趣:给定由“n”条曲线定义的多边形生成 ROI。

最佳答案

它不是动态分配的,所以一旦超出范围就会被销毁。在您的情况下,您的变量将在 DoSomething() 函数退出后超出范围。您的局部变量 cur_points 获取在您的循环中分配给它的 CreatePolyPoints() 的返回值。发生这种情况时,cur_points 的旧内容将不再存在 - 您无需担心这一点,因为该 vector 中的 Curve 对象的实例将分别被销毁 vector 被重新分配的时间。同样,当 cur_points 超出范围时。

编辑:你这里似乎确实有问题

std::vector<cv::Point> cur_points;
for(int i = 0; i < num_curves; ++i)
{
cur_points = CreatePolyPoints(m_curves[i]);
curves[i] = &cur_points[0]; // <-- problem
curve_sizes = cur_points.size();
}

您在每次迭代时将 vector 元素 0 的地址分配给 curvesith<​​ 元素 - 这里的问题是,这将是一个对象的地址不复存在。这是因为一旦 cur_points 在循环迭代中下一次被重新分配, vector 的内容将不再存在,因此您存储的指针不指向有效对象 - 它们指向已被分配的对象已经毁了循环结束后, vector 将包含在最后调用 CreatePolyPoints 时返回的内容。如果您想确保所有 cv::Point 对象仍然存在于您调用 cv::fillPoly 的点,您应该考虑通过引用传递 vector CreatePolyPoints() 函数,而不是每次都按值返回一个新 vector 。这将确保您通过 CreatePolyPoints 添加的所有项目在循环结束后仍然存在

关于c++ - 如果 std::vector 在释放时按值返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13711672/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com