做了个动态数组,释放时崩溃?其中调用了qsort

cfvmario 2016-03-26 03:47:47
写了一个程序,功能已经实现了,然而在最后释放时崩溃了,百思不得其解
程序结构是这样的:


struct Node { /* 此处没有指针成员 */ };

class NodeList // Node的动态数组
{
private:
Node *nodes;
int capacity;
int length;
public:
NodeList()
{
nodes = new Node[256];
memset(nodes, 0, 256*sizeof(Node));
capacity = 256;
length = 0;
}
int GetLength() { return length; }
Node* GetNextNode() //用此函数进行添加Node操作,必要时扩展存储空间
{
if (length == capacity)
{
capacity <<= 1;
cout << "Increasing capacity to " << capacity << "...";
Node *temp = new Node[capacity];
memcpy(temp, nodes, length*sizeof(Node) );
delete []nodes;
nodes = temp;
cout << "Complete\n";
}
return &nodes[length++];
}

Node& operator[](int i) const { return nodes[i]; }

~NodeList()
{
//delete []nodes; //按说应该有这句的,但无论有没有,程序都崩溃。本来期望注释掉这句的话,无非是个内存泄露,而内存泄露在main函数执行完时才会检测到,至少在return 0时下断点应该能断到。然而仍然是没断到就崩溃了
}
};

class Solver
{
private:
NodeList nodes;
int front;
bool tag;
public:
Solver(InputFunc f);
void Solve();
~Solver(void);
};

void Solver::Solve() //函数中涉及指针操作的只有以下片段
{
...
Node temp;
...
Node* n = nodes.GetNextNode();
memcpy(n, &temp, sizeof(Node));
...
int len = nodes.GetLength();
qsort(&nodes[front], len-front, sizeof(Node), CompareNode); //目前认为疑点在这里,front肯定没越界,不然早就里面崩了
...
}

int _tmain(int argc, _TCHAR* argv[])
{
Solver *solver = new Solver(InputBoard);
solver->Solve();
delete solver; //崩溃:corruption of heap什么的
return 0;
}

因为本来就没用到什么指针,所以感觉疑点最可能就在qsort里了。难道是qsort交换了指针指向的数据,导致delete时出错?
...全文
180 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cfvmario 2016-03-26
  • 打赏
  • 举报
回复
进一步调试,选些别的输入,发现确实有时会中途崩溃,崩溃在
GetNextNode
函数中的
delete []nodes
难道qsort这么用真的会把内存写坏。。
cfvmario 2016-03-26
  • 打赏
  • 举报
回复
我没说清楚,因为这个程序,输入不同时Node总数不同,可能的内存消耗是巨大的(Node可能会非常多),本来在某些输入下,就会因为Node过多,内存不足崩溃。所以,当然想尽量节省内存,所以不敢去用vector这东西,标准实现都比较复杂,肯定没有自己实现的紧凑吧,如果用vector,程序能容纳的最大Node数应该会更少,内存不足崩溃概率会更大……
cfvmario 2016-03-26
  • 打赏
  • 举报
回复
肯定有人说别用C这套函数,用c++ std的,然而问题是不怎么会用,写的时候肯定还是想优先用熟悉的函数 如果一定要用C的qsort,该怎么处理? 或者提一套用std的完整结构也可以。问题是我查了std的sort函数,不知道对对象来说怎么弄比较函数进去,而且看sort是对vector用的,没法和自己实现的动态数组结合到一起去。把自己的这个实现全砍掉改成vector吗?又不放心

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧