- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在为 C++ CRT DirectX 应用程序中 2000 多个对象的最近邻居编写一个动态八叉树。在调用新运算符 30 次后,程序会抛出“bad_alloc nomem”。我没有在其他任何地方使用 new。
我现在不知所措,以下是程序大纲以及我迄今为止为消除此错误所做的最大努力。即使在大量剪切之后仍然有很多 - 但请不要让它让您失望!
这是类结构:
template <typename T, int MaxObjPerNode>
class Octree
{...
public:
struct Node
{
int objcnt; // 0 == Node 4bytes
Node* parent; // 0 == Base 4bytes
D3DXVECTOR3 centre; //12bytes
Node* children[8]; //32bytes
Cube bounderies; //24bytes (Struct of 6 floats)
T* obj[MaxObjPerNode]; //4bytes *4
Node()
{
objcnt=0;
parent = 0;
centre = D3DXVECTOR3(0,0,0);
for (int t=0; t<8; t++)
children[t] = 0;
for (int t=0; t<MaxObjPerNode; t++)
obj[t] = 0;
}
Node* GiveBirth(int const Oct)
{
//...Sanity checks & intalisation
Node* NewNode = 0;
//_CrtMemState myBug;
NewNode = new Node(); // Nasty man sits here
//_CrtMemCheckpoint(&myBug);
NewNode->parent = this;
NewNode->centre = NewCentre;
//... rest of NewNode init.
}
//... Other functions sniped
}
private:
Node* base;
int StrtVecOff;
public:
Octree(float InitalCubeSize, T* FirstObj, long VectorOffset)
{
//D3DXVECTOR3* pTemp;
base = new Node();
StrtVecOff = VectorOffset; //Used to find Current Position in class T
base->objcnt = 1;
base->parent = 0;
base->obj[0] = FirstObj;
//... rest of base init.
}
Node* Add(T* Obj)
{
D3DXVECTOR3* Point = (D3DXVECTOR3*)(((long)(Obj))+StrtVecOff);
Node* InNode;
InNode = FindPlaceInTree(Point);
// FindPlaceInTree returns as Parent if Leaf has not been created from Node - So create leaf child
if (InNode->objcnt == 0)
{
int Oct = InNode->FindOctet(Point);
Node* ChildNode = InNode->GiveBirth(Oct);
ChildNode->obj[ChildNode->objcnt] = Obj;
ChildNode->objcnt +=1;
return ChildNode;
}
//...Other situations snipped
}
};
这是调用代码,
Octree<Mob,4> MyTree((float)(1<<13), &Bird[0],((long)&Bird[0].Pos - (long)&Bird[0]) );
for (int t=0;t<BirdsCount;t++)
MyTree.Add(&Bird[t]);
八叉树完美初始化,base* 正确指向有效数据。在 BANG 之前,对 new 的所有其他调用(30 * 92 字节)都没有问题。所以我进行了堆检查(在上面 GiveBirth 的注释代码处);通过 1:
- myBug {pBlockHeader=0x003d3208 lCounts=0x0012f938 lSizes=0x0012f94c ...} _CrtMemState
+ pBlockHeader 0x003d3208
_CrtMemBlockHeader * //..snip - correct
- lCounts 0x0012f938 unsigned int [5]
[0] 0 unsigned int
[1] 2 unsigned int //First time past + base
[2] 45 unsigned int
[3] 0 unsigned int
[4] 0 unsigned int
- lSizes 0x0012f94c unsigned int [5]
[0] 0 unsigned int
[1] 184 unsigned int //Correct 2*92
[2] 8409 unsigned int
[3] 0 unsigned int
[4] 0 unsigned int
lHighWaterCount 12505 unsigned int
lTotalCount 18238 unsigned int
第 2-28 遍:实际上都是相同的
第 29 次:
- myBug {pBlockHeader=0x003d5c50 lCounts=0x0012f938 lSizes=0x0012f94c ...} _CrtMemState
+ pBlockHeader 0x003d5c50 {pBlockHeaderNext=0x003d5bb8 pBlockHeaderPrev=0x00000000 szFileName=0x00000000 <Bad Ptr> ...} _CrtMemBlockHeader *
- lCounts 0x0012f938 unsigned int [5]
[0] 0 unsigned int
[1] 30 unsigned int
[2] 45 unsigned int
[3] 0 unsigned int
[4] 0 unsigned int
- lSizes 0x0012f94c unsigned int [5]
[0] 0 unsigned int
[1] 2760 unsigned int
[2] 8409 unsigned int
[3] 0 unsigned int
[4] 0 unsigned int
lHighWaterCount 12505 unsigned int
lTotalCount 20814 unsigned int
没有通过 30 :(我知道我有超过 2760 字节的空闲空间(我不再使用 vic 20!)。
我看了很多“相关问题”,仍然没有喜悦。欢迎任何建议
最佳答案
当 new
因任何原因失败时会抛出内存异常。它不一定是内存不足的情况。不要被愚弄了。某些东西在构造函数中抛出异常。
关于c++ - CRT & new - 92 字节的 30 次调用给出 "bad_alloc nomem",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5276168/
这个错误的原因是什么?其实我不想受到之前测试用例结果的影响所以在测试用例开始时,我清空了队列以便每个测试用例都可以重新开始。 " #include #include using name
我的程序中出现了 bad_alloc 异常。 这些是限制条件: 1 #include #include #include class SuffixArray { std::vector
我在 digital ocean 上使用 node.js 并尝试运行文件上传/下载服务器。 为了确保服务器在后台运行并且不会因错误而退出,我使用了以下内容 nohup nodejs server.js
[前注:我已经阅读了 StackOverflow 中的现有线程。我的问题似乎没有] 我正在研究 Quake 2 MD2 格式。在新建一个指针数组后,我似乎得到了错误的分配。但是,如果我做一些可怕的指针
使用QAudioOut我试图按顺序播放存储在QByteArray中的数据...这在追加少量数据时起作用,但是当数据过多时,可以说是2到3个小时的RAW PCM从不同组合追加由于堆的大小不足以同时保存所
我是C++的新手,我真的很想使用Botan连接到硬件加密 token 。我不知道是否错过了libs或dlls的任何设置。 我基于Building Botan library in Windows 10
我正在用 C++ 编写一些使用 BFS 搜索迷宫的代码(我的主要语言是 Python,但我想稍微锻炼一下我的 C++ 大脑...),我偶然发现了这个奇怪的错误。 这里是相关的数据结构: struct
我必须为我的单元测试导致 bad_alloc(基本上,为了 100% 的代码覆盖率,我无法更改某些函数)。我该怎么办? 这是我的代码示例。我必须在这里的某个地方引起 bad_alloc。 bool i
在 c++ 中,分配内存时会发生 bad_alloc,或者至少我是这么理解的,但现在我在从数组读取内存时遇到此错误。我创建数组: int * possible = new int[ suma ]; 然
我遇到编译器错误: 错误 C2061:语法错误:标识符“bad_alloc” 我以前在其他项目中使用过下面的代码块,在 try block 中使用不同的内存分配,没有问题。我希望有人能向我解释为什么
我使用了这个伪代码: h := 1 /* Initialization of the pivot row */ k := 1 /* Initialization of the pivot colu
我四处寻找这个问题的解决方案,但找不到,所以我只好问问。我的程序是一个迷宫游戏,其中包含许多不同的房间,每个房间都使用指针链接到一个或多个相邻的房间。玩家从一个房间导航到另一个房间,直到找到导出。 当
我正在尝试递归地 segmentation 球体以在面上实现球面小波算法。虽然我有 8 GB 的可用内存,但我只能将二十面体 segmentation 为 9 个级别。我的问题是在构建我的球体时内存不
我从事一个游戏项目。最近,我们遇到了一个问题,当我们加载/卸载不同的场景大约 3 次时,我们捕获了“bad_alloc”异常。 每次加载场景时,我们首先将压缩的 .zip 文件夹加载到内存中,然后从中
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
当构造函数中抛出bad_alloc异常时,其中创建了多个对象,必须做些什么来清理内存。例如。 class Object { private: A * a; B * b;
我的程序抛出一个 std::bad_alloc。调试后发现是代码中抛出的 curFinalBucket->points.push_back(p); 其中点是一个 vector .在代码行之前,curF
我目前正在做一个 C++ 项目,现在我已经卡住了一段时间了。这是关于使用表达式模板和(至少对我来说)一个奇怪的 bad_alloc 的延迟评估。 如果您尝试下面的代码,您会注意到由于最后一次添加 b+
所以我有一个结构 struct float3 { float x, y, z; }; 我正在尝试创建一个函数来获取 x、y、z 值并将它们映射到键 0、1、2 以对应其各自的维度。我写了下面的
考虑这个简单的程序: #include #include int main(void) { const std::size_t size = 1 size_t_max / sizeof(i
我是一名优秀的程序员,十分优秀!