在对项目进行了大量更改后,我创建了一个错误,我花了很长时间才追查.
我有一个包含动态分配数组的类.然后我创建了这个类的动态数组.然后我可以删除[]那个数组.但是,如果我在删除它之前替换数组中的项目,则会导致错误.在调试模式下,它提供了一个断言消息从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 []调用数组中所有对象的析构函数.当析构函数被调用时,它们应该删除项目的数据数组.我无法想象问题是什么,但我想如果有人能解释的话.
我正在为RTS游戏寻找路径,我正在从游戏网格构建导航网格.
我编写了一个类似于Marching Squares的算法,它可以创建并简化地图中可步行和不可行走区域之间的边界.现在我有一个仅由边缘组成的"网格".我需要对此网格进行三角测量,以便最终的三角剖分包含初始边,然后我可以删除不可移动的区域以在导航网格中创建孔.例如,我需要这样做......
三角形代表地图的可行走区域.这些洞代表了不可穿越的地区,如山脉或建筑物.网格可以被认为是2D,因为高度是无关紧要的.这显然是一个非常简化的案例.游戏中的导航网格将由数千个顶点和许多洞组成,但我可以将其分解为更小的块以进行动态更新.
我已经研究了受约束的Delaunay三角剖分算法,该算法首先创建点的Delaunay三角剖分,然后移除与受约束边相交的任何三角形,然后重新三角化移除的三角形.
对我来说,这似乎有点多余.我的网格不需要是Delaunay,它完全由约束边组成,所以如果可能的话,我想跳过额外的三角剖分.有更好的算法吗?我看了看,只能找到受约束的Delaunay算法.或者也许我错了,受约束的Delaunay算法最好?
我之前已经完成了从头开始的导航网格路径查找,但从未必须自己生成导航网格.三角测量算法对我来说是新的.任何见解?
我有一个程序,我需要非常频繁地将文本行写入日志文件.我想将日志文件中的行数限制为1000.当我将行写入文件时,它应该正常附加它们.一旦文件达到1000行,我想摆脱第一行,然后附加新行.有没有人知道是否有办法这样做,而不是每次都重写整个文件?
我正在写一个库,在其中我有一个类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++ ×3
algorithm ×2
arrays ×1
dynamic ×1
file ×1
inheritance ×1
mesh ×1
navigation ×1
polymorphism ×1
templates ×1
text ×1