访问冲突(未处理的异常) 我一直在遵循一个教程,在C++中编写一个堆栈,我相信我复制了他的代码行,但是我一直在获得这个未处理的异常错误。我原以为这和指针有关,但在浏览了我的程序之后,我无法识别任何被不适当访问的指针。确切的错误消息是:“Project50.exe中0x00D45446处的未处理异常:0xC0000005:访问冲突读取位置0x00000014。”程序输出是第四次推送,但前三次推送都没有(屏幕上显示的内容除外,空格应为虚线,但这会导致post格式为粗体):

访问冲突(未处理的异常) 我一直在遵循一个教程,在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;

名称:水 价值: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();
};
#包括
#包括
#包括
使用名称空间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视频然后错误地学习要慢得多。可能感觉快些,但事实并非如此。错误地学习是一种痛苦相信我,从一本书中正确地学习是值得的;如果没有别的,编程是很难的,你不应该期望在一瞬间轻松地完成它。