访问冲突(未处理的异常) 我一直在遵循一个教程,在C++中编写一个堆栈,我相信我复制了他的代码行,但是我一直在获得这个未处理的异常错误。我原以为这和指针有关,但在浏览了我的程序之后,我无法识别任何被不适当访问的指针。确切的错误消息是:“Project50.exe中0x00D45446处的未处理异常:0xC0000005:访问冲突读取位置0x00000014。”程序输出是第四次推送,但前三次推送都没有(屏幕上显示的内容除外,空格应为虚线,但这会导致post格式为粗体):
名称:水 价值:3 弹出 姓名: 我使用的是visual studio 2012,而编写教程的人使用的是Netbeans IDE。这可能是权限问题吗 头文件:访问冲突(未处理的异常) 我一直在遵循一个教程,在C++中编写一个堆栈,我相信我复制了他的代码行,但是我一直在获得这个未处理的异常错误。我原以为这和指针有关,但在浏览了我的程序之后,我无法识别任何被不适当访问的指针。确切的错误消息是:“Project50.exe中0x00D45446处的未处理异常:0xC0000005:访问冲突读取位置0x00000014。”程序输出是第四次推送,但前三次推送都没有(屏幕上显示的内容除外,空格应为虚线,但这会导致post格式为粗体):,c++,visual-studio,stack,access-violation,C++,Visual Studio,Stack,Access Violation,名称:水 价值:3 弹出 姓名: 我使用的是visual studio 2012,而编写教程的人使用的是Netbeans IDE。这可能是权限问题吗 头文件: #include <cstdlib> #include <iostream> #include <string> using namespace std; class Stack { private: struct item { string name; int value;
#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();
};
#包括
#包括
#包括
使用名称空间std;
类堆栈{
私人:
结构项{
字符串名;
int值;
项目*prev;
};
项目*堆垛机;
公众:
void Push(字符串名称、int值);
void Pop();
无效读取项(项*r);
作废打印();
堆栈();
~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 stack\n";
}
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;
}
}
#包括“Header.h”
使用名称空间std;
Stack::Stack(){
stackPtr=NULL;
}
堆栈::~Stack(){
项目*p1;
项目*p2;
p1=堆叠器;
while(p1!=NULL){
p2=p1;
p1->prev;
p2->prev=NULL;//实际上不需要,但区分p1和p2指向不同的对象
删除p2;
}
}
void Stack::Push(字符串名称,int值){
项目*n=新项目;
n->name=name;
n->value=value;
如果(stackPtr=NULL){//用于堆栈的第一项
stackPtr=n;
stackPtr->prev=NULL;//使堆栈底部的项指向NULL
}
否则{
n->prev=堆叠PTR;
stackPtr=n;
}
}
无效堆栈::ReadItem(item*r){
cout这里有一个错误:
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
这里有一个错误:
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
我正在使用visual studio 2012,而编写教程的人正在使用Netbeans IDE。这可能是权限问题吗
不,这是做教程的人的问题
不要在YouTube上从教程中学习C++。它们不能保证——不,非常不可能——是准确的。< /P>
代码混合了
=
和=
,违反了三个规则,导致复制错误。还有更多错误和样式不良的实例
我正在使用visual studio 2012,而编写教程的人正在使用Netbeans IDE。这可能是权限问题吗
不,这是做教程的人的问题
不要在YouTube上从教程中学习C++。它们不能保证——不,非常不可能——是准确的。< /P>
代码混合了=
和=
,违反了三个规则,导致复制时出错。还有更多错误和样式不佳的实例。如果我复制对象,您的类将立即失败。请参阅三个规则。不要使用命名空间std;
尤其不要在标头中使用。ReadItem应该是私有的。[顺便说一句,这些评论都不能解释这个问题]我不知道你为什么认为从YouTube视频中一行一行地复制代码永远不会导致错误。这个代码太可怕了(一方面,三分法则被打破)请学习C++。如果复制对象,你的类会立即失败。参见三的规则。不要使用<代码>使用命名空间STD;< /C>特别是在头文件中。Read项目应该是私有的。[BTW没有一个注释解释了这个问题]。我不知道你们为什么认为从YouTube视频中一行一行地复制代码永远不会导致错误。这个代码太可怕了(一方面,三分法则被打破)请学习C++,这可能是真的,但是回头看这个错误,使用赋值操作符是我自己的错。我知道我应该采取更深入的方法来真正地降低方法论的程度,但是读过大部分程序书,感觉很慢。“丹尼普尔:看YouTube视频要慢得多。然后错误地学习。可能感觉更快,但事实并非如此。错误地学习会对你当前和未来的生产力造成毁灭性的影响。相信我,从书本上正确地学习是值得的;如果没有别的,编程是很难的,你不应该期望在一瞬间轻松地完成。这可能是真的,但回头看看错误,我们会发现g作业操作员是我自己的错。我知道我应该采取更深入的方法来真正掌握方法论,但阅读大多数编程书的速度实在太慢了。@DanMinor:看YouTube视频然后错误地学习要慢得多。可能感觉快些,但事实并非如此。错误地学习是一种痛苦相信我,从一本书中正确地学习是值得的;如果没有别的,编程是很难的,你不应该期望在一瞬间轻松地完成它。