删除cpp中的指针和new运算符

时间:2016-01-12 21:35:07

标签: c++ pointers new-operator delete-operator assertion

我是否必须删除指针才能使用new? 我尝试了这样的代码:

accessElem :: Int -> MyArray -> Maybe Char
accessElem i a = a ^? ix i

它让我断言失败...... 当我使用新的

时,我已经使用了带指针的删除
std::vector<float>* intersections;

    intersections=&KIN_Trigonometry::getIntersectionCircleAndLine( xA, yA, xB, yB, x, y, radius * 2, nbPoints);

    delete intersections;

感谢您的支持

4 个答案:

答案 0 :(得分:4)

对于示例代码int* p = new int[2]; delete p;,您创建了一个新数组,因此您应该使用delete[]而不是delete

请参阅cplusplus参考:operator delete[]

与此同时,我意识到你正在询问上面的代码块。由于您没有使用operator new分配对象,因此您不应使用operator deleteoperator delete[]来解除分配。那是你的问题。

有可能,您可能希望使用free()取消分配此对象,如果您要取消分配它。您需要检查代码或其文档以确定。

基于你正在获取函数返回值的地址这一事实,我认为你根本不应该自己解除这个。

答案 1 :(得分:4)

注意&#39;交叉点=&amp; ....&#39;您正在获取返回值的地址,这不会使您成为其所有者。

我怀疑你应该这样做

std::vector<float> & intersections=KIN_Trigonometry::getIntersectionCircleAndLine( xA, yA, xB, yB, x, y, radius * 2, nbPoints);

或者

std::vector<float>  intersections=KIN_Trigonometry::getIntersectionCircleAndLine( xA, yA, xB, yB, x, y, radius * 2, nbPoints);

你必须检查get函数的签名

答案 2 :(得分:0)

您无法在第一个语句中删除intersections,因为交叉点(据我们在此处可以看到)没有分配空间,它只是指向地址的链接。所以你必须使用intersectionsnew分配一个内存空间,然后删除这个内存空间。

答案 3 :(得分:0)

这段代码甚至不应该编译。

intersections = &KIN_Trigonometry::getIntersectionCircleAndLine(...);

尝试获取已返回临时的地址,这是禁止的。您要么使用非常糟糕的编译器编译代码,要么您没有向我们提供真正的代码。