Code Bye

多个结构体相互嵌套,变量初始化有问题,使用vector导致栈溢出

#include <iostream>
#include <vector>
#include <string>
using namespace std;
#define l_capacity 3
class predicate
{
public:
	predicate(){};
	predicate(string a, string o, int v) :attr(a), opera(o), value(v){};
public:
	string attr;
	string opera;
	int value;
};
struct Event
{
	vector <predicate> pred;
};
struct Lnode
{
	vector <Event> saveSub;
};
struct c_node
{
	int parent;
	Lnode *lnode;
	struct p_directory *pdir;
};
struct value_bound
{
	int startBound;
	int endBound;
};
struct c_directory
{
	value_bound valuebound;
	string attr;
	c_node *cnode;
	c_directory *lChild, *rChild;
};
struct p_node      //p节点,存属性名
{
	string attr;
	c_directory cdir;
	//vector <string> attrMatched;
};
struct p_directory
{
	vector <p_node> pnode;
};
void InsertBETree(Event sub, c_node cnode, c_directory cdir, vector <string> attrMatched){}
int main()
{
	Event subscription_set1 = { { predicate("a", "=", 1), predicate("B", "<", 2), predicate("C", "<", 2) } };
	c_node *cnode;
	cnode = (c_node *)malloc(sizeof(c_node));
	(*cnode).lnode = NULL;
	(*cnode).pdir = NULL;
	(*cnode).parent = 1;
	c_directory cdir;
	cdir.valuebound.startBound = 1;
	cdir.valuebound.endBound = 4;
	cdir.cnode = NULL;
	cdir.lChild = NULL;
	cdir.rChild = NULL;
	vector <string> attrMatched;
	for (int i = 0; i < 4; i++)
	{
		InsertBETree(subscription_set1,*cnode,cdir,attrMatched);
	}
	return 0;
}

InsertBETree()函数本人就不具体写了,本人用VS2013点击F5调试出现的错误是:
0x002328B9 处有未经处理的异常(在 ConsoleApplication3.exe 中):  0xC0000005:  读取位置 0x00000008 时发生访问冲突。
然后进入中断进入了下面这样

前面定义的结构体有相互嵌套的关系,cnode包含pdirectory,pdirectory包含pnode,pnode包含cdirectory,cdirectory包含cnode。
在main函数里面的76行代码出设置断点,执行到这里再按F11并不能跳进InsertBETree函数里面,感觉应该是初始化主函数里面初始化cnode,cdir,有问题是不是堆溢出了还是怎么个情况,帮忙分析并解决一下。

解决方案

15

0x00000008
你这是指针指向了非法地址吧。这种地址应该不会用到的
你看下你那个指针怎么赋值和运算的

15

用你查看函数堆的功能,能知道到底发生了什么

25

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

15

引用:
Quote: 引用:

用你查看函数堆的功能,能知道到底发生了什么


本人不会看堆,本人猜问题出在了InsertBETree(subscription_set1,*cnode,cdir,attrMatched);这里。
但是本人改代码,只考虑subscription_set1时

Event Insert(Event sub)
{
	predicate pred = { "B", "<", 2 };
	for (int i = 0; i < 2; i++)
	{
		sub.pred.push_back(pred);
	}
	return sub;
}
int main()
{
//前面不写了
for (int i = 0; i < 3; i++)
	{
		Event sub = subscription_set1;
		sub=Insert(sub);
		cout << sub.pred.size() << endl;
	}
}

并没有出现问题,完美运行

根据堆 ,问题发生在InsertBETree函数里

10

引用:
Quote: 引用:

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

谢谢,根据你的方法,找到了问题所在,暂时解决了

你指针是NULL  就不能使用这个指针。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明多个结构体相互嵌套,变量初始化有问题,使用vector导致栈溢出