【问题标题】:Delete a pointer in cpp and the new operator删除 cpp 中的指针和 new 运算符
【发布时间】:2016-01-12 21:35:06
【问题描述】:

我是否只能在使用 new 时删除指针? 我试过这样的代码:

std::vector<float>* intersections;

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

    delete intersections;

它给我断言失败...... 我在使用 new like 时已经使用了带指针的 delete

int* p = new int[2];
delete p;

感谢您的支持

【问题讨论】:

  • 要么getIntersectionCircleAndLine返回对成员变量的引用(在堆栈上,最有可能的选项),要么分配内存,返回指向它的指针,但决定管理内存(即调用delete[]) 之后。无论哪种方式,都会发生双重删除,您可能不应该这样做
  • 谢谢你!我也是这么想的,我不明白为什么我的话题投了反对票……
  • 你能显示 KIN_Trigonometry::getIntersectionCircleAndLine 函数的签名吗?
  • 静态 std::vector getIntersectionCircleAndLine(float xl, float yl, float xl2, float yl2, float xC, float yC, float r, int circlesPoints);
  • @sachaamm,它没有编译,你是怎么编译的? my code

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


【解决方案1】:

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

参见 cplusplus 参考:operator delete[]

同时,我知道您是在询问上面的代码块。由于您没有使用operator new 分配对象,因此您不应该使用operator deleteoperator delete[] 来释放它。那是你的问题。

如果你想释放它,你可能想使用free() 释放这个对象。您需要检查代码或其文档以确定。

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

【讨论】:

  • 和delete[]结果一样
  • 肯定不是。 std::vector 不是由 new[] 分配的。就 c++ 而言,它不是一个“数组”,它是一个对象
  • 这个答案其实是指他的示例代码int* p = new int[2]; delete p;
  • 啊,是的——但他的例子与他的问题无关。他正在获取返回值的地址,然后删除 - 没有任何好处
  • 在 OP 询问的情况下,您永远不应该使用 deletedelete[]
【解决方案2】:

注意'intersection = &....' 你正在获取返回值的地址,这并不意味着你是它的所有者。

我怀疑你应该这样做

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 函数的签名

【讨论】:

  • 是的,谢谢,但是我使用了几种方法来通过静态方法获取浮点返回的向量,一切都很好,但是当我尝试获取交叉点的大小时,我遇到了错误:错误 5 错误 C3867: 'std::vector>::size': 函数调用缺少参数列表;使用 '&std::vector>::size' 创建指向成员的指针
  • 这甚至不应该编译。
  • @sachaamm:这无关。您可以通过添加 () 来修复它:size_t sz = intersections.size( );
  • @MSalters:对,就是这样
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    尝试获取返回的临时地址,这是被禁止的。你要么用非常糟糕的编译器编译代码,要么你没有给我们真正的代码。

    【讨论】:

    • 它与 Visual Studio 2013 一起编译,但是当我尝试从交叉点获取任何东西时(比如向量的大小),我得到了错误。而 KIN_Trigonometry() 是一个静态向量 (我不知道它是否重要?)
    • std::vector* intersections2; //*intersections2 = std::vector(); // 这会导致中断错误 intersections2 = &KIN_Trigonometry::getIntersectionCircleAndLine2(A.x, A.y, B.x, B.y, x, y, radius * 2, nbPoints); // 编译 cout
    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 2012-01-13
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多