访问冲突(未处理的异常)
所以我一直在关注在C ++中创建堆栈的教程(这里),并且我相信我复制了他的代码行以用于行,但是我一直得到这个未处理的异常错误。 我认为这与指针有关,但是在完成我的程序后,我无法识别任何不适当地访问的指针。 确切的错误消息是:“Project50.exe中0x00D45446未处理的异常:0xC0000005:访问冲突读取位置0x00000014。” 程序输出是第4次推送,但前三次都没有(屏幕上出现的内容除了空格应该是虚线,但是这会导致文章格式变为粗体):
名称:水值:3
啪
名称:
我正在使用Visual Studio 2012,而做这个教程的人正在使用Netbeans IDE。 这可能是一个权限问题吗?
头文件:
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
class Stack {
private:
struct item {
string name;
int value;
item* prev;
};
item* stackPtr;
public:
void Push(string name, int value);
void Pop();
void ReadItem(item* r);
void Print();
Stack();
~Stack();
};
堆栈实现:
#include "Header.h"
using namespace std;
Stack::Stack() {
stackPtr = NULL;
}
Stack::~Stack() {
item* p1;
item* p2;
p1 = stackPtr;
while( p1 != NULL) {
p2 = p1;
p1 ->prev;
p2->prev = NULL; // Not actually necessary, but distinguishes that p1 and p2 are pointing to different things
delete p2;
}
}
void Stack::Push(string name, int value) {
item* n = new item;
n->name = name;
n->value = value;
if(stackPtr = NULL) { // For first item of the stack
stackPtr = n;
stackPtr->prev = NULL; // So that the item at the bottom of the stack points to null
}
else {
n->prev = stackPtr;
stackPtr = n;
}
}
void Stack::ReadItem(item* r) {
cout << "-------------------------n";
cout << "name: " << r->name << endl;
cout << "value: " << r->value << endl;
cout << "-------------------------n";
}
void Stack::Pop() {
if(stackPtr = NULL) {
cout << "There is nothing on the stackn";
}
else {
item* p = stackPtr;
ReadItem(p);
stackPtr = stackPtr->prev;
p->prev = NULL; // Again, like the one in the destructor, not actually necessary.
delete p;
}
}
void Stack::Print() {
item* p = stackPtr;
while(p != NULL) {
ReadItem(p);
p = p->prev;
}
}
主要:
#include "Header.h"
using namespace std;
int main(int argc, char** argv) {
Stack Dan;
Dan.Push("Dan", 3);
Dan.Push("Coffee", 1);
Dan.Push("Donuts", 0);
Dan.Push("Water", 3);
Dan.Print();
cout<< "Poppingn";
Dan.Pop();
cout<< "Poppingn";
Dan.Pop();
cout<< "Poppingn";
Dan.Pop();
cout<< "Poppingn";
Dan.Pop();
cout<< "Poppingn";
Dan.Pop();
cout << 'n';
system("PAUSE");
return 0;
}
我正在使用Visual Studio 2012,而做这个教程的人正在使用Netbeans IDE。 这可能是一个权限问题吗?
不,这是做这个教程的人的问题。
不要从YouTube上的教程学习C ++。 他们不能保证 - 不太可能 - 准确。
代码混合=
和==
,违反了三条规则,导致复制错误。 还有更多的错误和风格不佳的例子。
这里有一个错误:
void Stack::Pop() {
if(stackPtr = NULL) {
^
this should be ==
Stack::Push
错误。
在析构函数中:
Stack::~Stack() {
item* p1;
item* p2;
p1 = stackPtr;
while( p1 != NULL) {
p2 = p1;
p1 ->prev; // this statement does nothing
链接地址: http://www.djcxy.com/p/86831.html