我正在研究将植绒算法应用到更大的系统中.OGRE用于渲染,luabind用于能够从LUA,yatta yatta进行通信,这些东西不应该太重要.
我基本上按雷诺'boids-model实现了算法.这意味着,一个Boid(如"群中的一条鱼")根据它在某个半径内的邻居移动.事情就是这样,它的基本复杂性是O(n²),因为如果它们在范围内,每个boid都必须检查所有它们的flockmates,然后考虑一些因素来计算自己的运动.
算法本身实现并运行顺畅.它接受所有不同尺寸的模型,它可以在2D和3D空间中工作,它很好吃,我已经有一段时间了.
我的问题是,当我在boid数字中遇到一种"障碍"时,算法会在运行时崩溃,大约200-250甚至变化.现在,如果它变得越来越慢,直到我被打破到1 fps,我就能理解,算法的简单性能就是问题所在.但是,例如,199 boids完美运行,201根本不工作并且在运行时崩溃.这对我来说非常令人惊讶.
我实现了两个类:"Swarm"和"Boid".Swarm用于保存指向swarm的所有boid的指针,但计算不多,在Boid中发生移动.
swarm.h:
#ifndef __SWARM_H__
#define __SWARM_H__
#include <vector>
#include "boid.h"
namespace Core {
class swarm {
public:
swarm();
~swarm();
bool move(float timeSinceLastFrame);
bool addBoid(boid *thisBoid);
bool removeBoidByName(std::string boidName);
bool writeAllBoidNames();
std::vector<boid*> getFlockMates();
private:
std::vector<boid*> flock;
float timePassed;
};
}
#endif
Run Code Online (Sandbox Code Playgroud)
boid.h:
#ifndef __BOID_H__
#define __BOID_H__
#include "Ogre.h"
#include <vector>
#include <stdlib.h>
namespace Core {
class swarm;
class boid {
public:
boid(Ogre::SceneNode *thisNode, Ogre::String orientation, swarm *thisSwarm); // Constructor - direkter Node-Zugriff
boid(Ogre::MovableObject *thisObject, …Run Code Online (Sandbox Code Playgroud) 如果已知应用程序泄漏内存(执行时),那么在应用程序的源代码中找到此类内存泄漏错误的各种方法有哪些.
我知道某些解析器/工具(可能对代码进行静态分析)可以在这里使用但是有没有其他方法/技术可以做到这一点,特定于语言(C/C++)/平台?
我有一段时间没有做过任何C++,但决定完成一个我正在为某人工作的大项目.我现在收到以下错误消息但...
HEAP CORRUPTION DETECTED:在正常阻止(#1761)之后在0x17DEB940.CRT检测到应用程序在堆缓冲区结束后写入内存.
我一直在踩过我认为可能导致它的所有功能,但我不知所措.有没有办法使用更高级的调试功能来追捕它?
我知道已经存在许多类似的问题和答案,但我无法解决我的问题.
在我的大应用程序中,堆在某处被破坏,我无法找到它.我也使用像gflags这样的工具,但没有运气.
我在下面的示例中尝试了gflags,它会破坏堆的目的:
char* pBuffer = new char[256];
memset(pBuffer, 0, 256 + 1);
delete[] pBuffer;
Run Code Online (Sandbox Code Playgroud)
第2行堆被覆盖但是如何通过gflags,windbg等工具找到它.可能我没有正确使用gflags.
我有一个Visual Studio 2010解决方案,包含C#(托管),C++/CLI(非托管)和纯C++(本机)项目.我想在所有3个项目中或至少围绕本机代码执行内存泄漏检测:
我已经尝试过使用英特尔Inspector XE 2011,但它太慢了......做一个简单的事情,比如只是初始化我的系统并花了很长时间才完成我还没有完成它.当我在没有IXE 2011的情况下运行我的系统时,初始化我的系统需要不超过10-15秒,而使用IXE我们让它运行几个小时并且它不会超过初始化.我试图排除某些库被分析,但它绝对没有效果.
我已经尝试使用Visual Leak Detector,但在完成运行后它说它找不到任何内存泄漏.我对这个结果持怀疑态度所以我故意在经常运行的函数中放置一段代码以确保存在内存泄漏:
int* memoryLeak = new int;
Run Code Online (Sandbox Code Playgroud)
我再次使用VLD运行,但它吐出了相同的消息.我正在考虑重写new/ delete运算符,甚至只考虑malloc/ free,但我想确保在我深入研究之前已经用尽所有其他选项.
如何使用Visual Studio 2010分析我的本机C++库的内存使用情况?是否有其他工具或技术可行(即使它们没有与VS2010集成)?
我有一个C++程序,它调用由Flex/Bison生成的一些C例程.
当我以Windows 8.1 64位平台为目标时,我在运行时遇到以下异常:
Unhandled exception at 0x0007FFFA70F2C39 (libapp.dll) in application.exe: 0xC0000005:
Access violation writing location 0x000000005A818118.
Run Code Online (Sandbox Code Playgroud)
我将此异常跟踪到以下代码:
YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
{
YY_BUFFER_STATE b;
b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
if ( ! b )
YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
b->yy_buf_size = size; // This access is what throws the exception
}
Run Code Online (Sandbox Code Playgroud)
作为参考,代码中的其他地方(也由Flex/Bison生成),我们有:
typedef struct yy_buffer_state *YY_BUFFER_STATE;
struct yy_buffer_state
{
FILE *yy_input_file;
char *yy_ch_buf;
char *yy_buf_pos;
yy_size_t yy_buf_size;
// ... …Run Code Online (Sandbox Code Playgroud) 考虑下面的程序
char str[5];
strcpy(str,"Hello12345678");
printf("%s",str);
Run Code Online (Sandbox Code Playgroud)
运行此程序时会出现分段错误.
但是当strcpy被替换为以下时,程序运行正常.
strcpy(str,"Hello1234567");
Run Code Online (Sandbox Code Playgroud)
所以问题是当尝试复制到str超过5个字符长度的任何其他字符串时它应该崩溃.
那么为什么它不会因为"Hello1234567"崩溃而只会崩溃为"Hello12345678",即长度为13或超过13的字符串.
该程序在32位机器上运行.
我不知道该怎么办......它毫无希望.我已经厌倦了猜测导致崩溃的原因.最近我注意到一些opengl调用在一些gfx卡上随机崩溃程序.所以我现在变得非常偏执,什么可能导致崩溃.这次崩溃的坏处是它只在使用该程序很长时间后崩溃,所以我只能猜出是什么问题.
我无法记住我对程序造成的可能导致崩溃的更改,已经很长时间了.但幸运的是,以前的版本没有崩溃,所以我可以只复制一些代码,浪费10个小时,看看它开始崩溃...我不认为我想这样做.
程序崩溃后,我连续5次处理相同的文件,每次在进程中使用大约200兆字节的内存.在阅读过程中和之后,它会随机崩溃.
我创建了一个"安全"的free()函数,它检查指针是否为非NULL,然后释放内存,然后将指针设置为NULL.这不是应该怎么做的?
我看到了任务管理器的内存使用情况,就在它崩溃之前它开始吃的内存比平常多2倍.每次加载文件时,程序加载速度也会呈指数级增长; 最初的几个负载看起来并没有显得慢得多,但随后它开始迅速加倍负载速度.这应该告诉我有关崩溃的信息?
另外,我是否必须使用clear()手动释放c ++向量?或者它们在使用后自动释放,例如,如果我在函数内部分配向量,那么每次函数结束时它是否会被释放?我没有在向量中存储指针.
-
简而言之:我想学会尽可能快地捕捉该死的虫子,我该怎么做?使用Visual Studio 2008.
有没有人知道更好/更快的方式获得调用堆栈比"StackWalk"?我也认为对于有很多变量的方法,stackwalk也可能会变慢...(我想知道商业分析器的用途是什么?)我在Windows上使用C++.:) 谢谢 :)
每当我看到联合的例子时,它们总是不同的类型.例如,来自MSDN:
// declaring_a_union.cpp
union DATATYPE // Declare union type
{
char ch;
int i;
long l;
float f;
double d;
} var1; // Optional declaration of union variable
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
如果我有一个联合(在这种情况下是匿名的,但这不重要)会发生什么,如下所示:
union
{
float m_1stVar;
float m_1stVarAlternateName;
};
Run Code Online (Sandbox Code Playgroud)
无论这是否是好的做法,这会导致任何问题吗?
c++ ×10
c ×3
memory-leaks ×2
windows ×2
c++-cli ×1
callstack ×1
corruption ×1
debugging ×1
flex-lexer ×1
heap-memory ×1
malloc ×1
native ×1
opengl ×1
unions ×1
unmanaged ×1
visual-c++ ×1
windows-xp ×1