小编Jan*_*ott的帖子

C++解释此删除[]错误?

在对项目进行了大量更改后,我创建了一个错误,我花了很长时间才追查.

我有一个包含动态分配数组的类.然后我创建了这个类的动态数组.然后我可以删除[]那个数组.但是,如果我在删除它之前替换数组中的项目,则会导致错误.在调试模式下,它提供了一个断言消息从dbgdel.cpp"表达式:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)".这是一个小程序来演示.

class SomeClass {
public:
    int *data;

    SomeClass() {
        data = nullptr;
    }
    SomeClass(int num) {
        data = new int[num];
    }
    ~SomeClass() {
        if (data != nullptr) { 
            delete[] data;
        }
    }
};

int main(int argc, char *args[]) {
    SomeClass *someArray = new SomeClass[10];

    //If you comment this out, there is no error.  Error gets thrown when deleting
    someArray[0] = SomeClass(10);

    delete[] someArray;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我很好奇,为什么会这样?当替换数组中的项时,将调用其析构函数.然后,新项目将数据分配在与数组不同的位置.然后delete []调用数组中所有对象的析构函数.当析构函数被调用时,它们应该删除项目的数据数组.我无法想象问题是什么,但我想如果有人能解释的话.

c++ arrays dynamic delete-operator

8
推荐指数
2
解决办法
1649
查看次数

最快的带孔洞的三角剖分算法?

我正在为RTS游戏寻找路径,我正在从游戏网格构建导航网格.

我编写了一个类似于Marching Squares的算法,它可以创建并简化地图中可步行和不可行走区域之间的边界.现在我有一个仅由边缘组成的"网格".我需要对此网格进行三角测量,以便最终的三角剖分包含初始边,然后我可以删除不可移动的区域以在导航网格中创建孔.例如,我需要这样做......

在此输入图像描述

三角形代表地图的可行走区域.这些洞代表了不可穿越的地区,如山脉或建筑物.网格可以被认为是2D,因为高度是无关紧要的.这显然是一个非常简化的案例.游戏中的导航网格将由数千个顶点和许多洞组成,但我可以将其分解为更小的块以进行动态更新.

我已经研究了受约束的Delaunay三角剖分算法,该算法首先创建点的Delaunay三角剖分,然后移除与受约束边相交的任何三角形,然后重新三角化移除的三角形.

对我来说,这似乎有点多余.我的网格不需要是Delaunay,它完全由约束边组成,所以如果可能的话,我想跳过额外的三角剖分.有更好的算法吗?我看了看,只能找到受约束的Delaunay算法.或者也许我错了,受约束的Delaunay算法最好?

我之前已经完成了从头开始的导航网格路径查找,但从未必须自己生成导航网格.三角测量算法对我来说是新的.任何见解?

navigation algorithm mesh triangulation

7
推荐指数
1
解决办法
3370
查看次数

将有限数量的行写入文本文件的算法

我有一个程序,我需要非常频繁地将文本行写入日志文件.我想将日志文件中的行数限制为1000.当我将行写入文件时,它应该正常附加它们.一旦文件达到1000行,我想摆脱第一行,然后附加新行.有没有人知道是否有办法这样做,而不是每次都重写整个文件?

c++ algorithm text file

5
推荐指数
1
解决办法
1076
查看次数

带派生类的C++模板

我正在写一个库,在其中我有一个类BaseClass.使用该库的任何人都将创建自己的继承自BaseClass的类.我有另一个类,我们称之为Manager,它包含一个BaseClass指针的向量,它可以包含从BaseClass派生的任何对象.

Manager类必须处理添加到其BaseClass向量的任何对象的创建和销毁.这是因为可以随时删除向量中的任何对象,也可以删除Manager本身.因此,库的用户无法通过向指向从BaseClass派生的现有对象传递指针来向Manager的baseClass向量添加对象.实际上,我可以允许用户这样做.但这将涉及复制虚拟对象,我宁愿不这样做.

为了解决这个问题,我正在尝试使用模板功能.在尝试将其添加到Manager的向量时,用户应传递从BaseClass派生的对象的类型.这就是我现在拥有的.

//Manager.h
#include <vector>
#include "BaseClass.h"
#include <typeinfo>

class Manager {
    //Vector holding pointers to any objects inherited from BaseClass
    vector<BaseClass*> baseClasses;

    //Template function that needs to add NEW object to baseClass vector
    //This I'm having problems with
    template<class T>
    BaseClass* Add() {
        BaseClass* baseClass = new T();
        baseClasses.push_back(baseClass);
        return baseClass;
    }

    //Template function that gets object from baseClass vector
    //This works fine
    template<class T>
    BaseClass* Get() {
        for (int i = 0; i < baseClasses.size(); i++) { …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism inheritance templates derived-class

1
推荐指数
1
解决办法
2662
查看次数