vector调用push_back为什么会失败?初始化了也不行

青春不谢 2015-04-13 10:22:20
头文件handle.h
#ifndef _HANDLE_H
#define _HANDLE_H

class Handle{
struct StackOfInt;
StackOfInt* smile;
public:
void initialize();
void cleanup();
void push(int elem);
int fetch();
int pop();
int count();
};

#endif//_HANDLE_H

类class的函数定义
#include<iostream>
#include<vector>
#include "handle.h"
using namespace std;

struct Handle::StackOfInt{
vector<int> top;
};

void Handle::initialize()
{
StackOfInt* smile = new StackOfInt;
smile->top.reserve(100);
cout << smile->top.capacity() << endl;
}

void Handle::cleanup()
{
delete smile;
}

void Handle::push(int elem)
{
cout << "before push\n";
smile->top.push_back(elem);
cout << "after push\n";
}
int Handle::fetch()
{
return smile->top.back();
}
int Handle::pop()
{
int n = smile->top.back();
smile->top.pop_back();
return n;
}
int Handle::count()
{
return smile->top.size();
}

主函数main.cpp
#include<iostream>
#include "handle.h"
using namespace std;

int main()
{
Handle h;
h.initialize();
for (int i = 0; i < 10; i++)
{
h.push(i);
cout << "last element is " << h.fetch() << endl;
}
for (int i = 0; i < 10; i++)
{
h.pop();
}

return 0;
}

打断点调试的时候,总是在push_back这里挂掉。错误信息大概是说内存溢出(显示说某个地址不可用什么的)。请大家帮忙看看?
...全文
744 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mewiteor 2015-04-14
  • 打赏
  • 举报
回复
void Handle::initialize()
中的smile是局部变量,Handle中的smile未被赋值。
赵4老师 2015-04-14
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
幻夢之葉 2015-04-14
  • 打赏
  • 举报
回复
void Handle::initialize()
{
    /* StackOfInt* */smile = new StackOfInt;
    smile->top.reserve(100);
    cout << smile->top.capacity() << endl;
}
fly_dragon_fly 2015-04-14
  • 打赏
  • 举报
回复
StackOfInt* smile = new StackOfInt;
把前面的StackOfInt* 去掉
哈利_蜘蛛侠 2015-04-14
  • 打赏
  • 举报
回复
没有仔细研究你的代码。但是你在handle.h文件中的class定义中的

 struct StackOfInt;
这个语句是定义了类内部的一个类吧?那么在定义类的时候,不是应该把它的所有成员都列出来吗?比如说这样:

struct StackOfInt{
    vector<int> top;
};
青春不谢 2015-04-14
  • 打赏
  • 举报
回复
引用 4 楼 fly_dragon_fly 的回复:
StackOfInt* smile = new StackOfInt;
把前面的StackOfInt* 去掉
如您所述,问题已经找到,谢谢~!
青春不谢 2015-04-14
  • 打赏
  • 举报
回复
引用 3 楼 u011873969 的回复:
没有仔细研究你的代码。但是你在handle.h文件中的class定义中的

 struct StackOfInt;
这个语句是定义了类内部的一个类吧?那么在定义类的时候,不是应该把它的所有成员都列出来吗?比如说这样:

struct StackOfInt{
    vector<int> top;
};
没有在头文件里定义结构体StackOfInt的结构是因为我在练习句柄类Handle的使用。这样的技术可以隐藏实现代码,也不让其他人看到你的结构体定义。应用开发者只需要一个头文件和一个库文件就可以开发了而并不知道实现细节。同时这样做的好处还有,当你要改变结构体StackOfInt的定义时,只需要在StackOfInt.cpp文件里修改,编译器只重新编译该cpp文件即可,而不会编译包含头文件的所有cpp函数
青春不谢 2015-04-14
  • 打赏
  • 举报
回复
引用 2 楼 mewiteor 的回复:
void Handle::initialize()
中的smile是局部变量,Handle中的smile未被赋值。
非常感谢,确实是这样的。初始化函数里的是局部变量,而成员变量没有初始化。
bear234 2015-04-13
  • 打赏
  • 举报
回复
没细看你的代码 不过这种问题一般是你没有初始化你的容器造成的 比如你在一个class里写了一个数据成员:vector<int> v; 但是你没有在构造函数里写:v = vector<int>(); 这样会报错

64,282

社区成员

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

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