做了个动态数组,释放时崩溃?其中调用了qsort
写了一个程序,功能已经实现了,然而在最后释放时崩溃了,百思不得其解
程序结构是这样的:
因为本来就没用到什么指针,所以感觉疑点最可能就在qsort里了。难道是qsort交换了指针指向的数据,导致delete时出错?
程序结构是这样的:
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时出错?
...全文
相关推荐
C语言中的回调函数
本课程通过对C语言中回调函数概念和代码实例的深入剖析讲解,使学员轻松掌握回调函数的机制和用法,并避免实际使用中的陷阱。
c++出错调试经验
个人学习c++过程中,出错的一些个人认为不容易发现的错误。
C语言要点总结
C语言要点总结 ,网上看的,感觉很好,和大家分享下!
GDB用户手册(中文)
GDB中文手册,欢迎下载。详细地描述了GDB的特性及用法,是学习GDB的好教材。
C语言指针详解[项目源码]
本文详细介绍了C语言中指针的概念、类型、操作及其应用。从初阶指针的基本概念、指针类型、野指针的成因与防范,到指针与数组的关系、二级指针的使用,再到进阶指针中的字符指针、指针数组、数组指针、函数指针及其数组、指向函数指针数组的指针以及回调函数的定义与使用。文章通过丰富的代码示例和详细解释,帮助读者深入理解指针的各个方面,并提供了实际应用场景的演示,如简易计算器的实现和qsort函数的模拟。适合有一定C语言基础的读者进一步学习和掌握指针的高级用法。


