【问题标题】:Linked lists insertion (core dumped)链表插入(核心转储)
【发布时间】:2017-04-13 16:30:38
【问题描述】:

我的头文件和实现文件

#ifndef VIKTOR_H_
#define VIKTOR_H_

#include <iostream>

template <class DataType>
class viktor {

private:
    template <class NodeType>
    struct Node {

        NodeType data;
        Node<NodeType> * next;

    };

    Node<DataType> * backPtr;
    int length;

public:

    viktor();
    ~viktor();

    DataType &operator [] (int) const;

    void push(const DataType &);

    friend std::ostream &operator << (std::ostream &strm, const 
viktor<DataType> &A){

        for(int i = 0; i < A.length; ++i) {

            strm << A[i] << " " << std::flush;
        }

        strm << std::endl;

        return strm;
    }
};
template <class DataType>
viktor<DataType>::viktor() {

backPtr = nullptr;

length = 0;
}
template <class DataType>
viktor<DataType>::~viktor() {

if ( length == 0 ) return;

Node<DataType>* previousPtr = backPtr;
Node<DataType>* nextPtr = backPtr->next;

while( nextPtr != backPtr )
{

    nextPtr = nextPtr->next;

    previousPtr->next = nullptr;
    delete previousPtr;
    length--;

}

backPtr->next = nullptr;
delete backPtr;
}
template <class DataType>
void viktor<DataType>::push(const DataType &item) {

Node<DataType>* newNode = new Node<DataType>;

newNode->data = item;

std::cout << "data: " << newNode->data << std::endl;

if(length != 0) {

    newNode->next = backPtr->next;
    backPtr->next = newNode;
}
else {

    newNode->next = newNode;
}

backPtr = newNode;

length += 1;
//std::cout << "Finished pushing..." << std::endl;
}
template <class DataType>
DataType &viktor<DataType>::operator [] (int i) const {

Node<DataType>* conductor = backPtr;

if (i > length) {

    throw "Item is inaccessible";
}
for (int j = 0; j <= i; ++j) {

        conductor = conductor->next;
}

return conductor->data;
}

#endif //VIKTOR_H_

这个功能有问题

template <class DataType>
void viktor<DataType>::push(const DataType &item) {

Node<DataType>* newNode = new Node<DataType>;

newNode->data = item;

std::cout << "data: " << newNode->data << std::endl;

if(length != 0) {

    newNode->next = backPtr->next;
    backPtr->next = newNode;
}
else {

    newNode->next = newNode;
}

backPtr = newNode;

length += 1;
//std::cout << "Finished pushing..." << std::endl;
}

我正在使用这个测试驱动程序

int main() {

viktor<int> blah;

blah.push(2);

std::cout << blah << std::endl;
}

现在如果我只推一次,但如果我这样做,它就可以工作

blah.push(1);
blah.push(2);

它运行并打印我想要的所有数据,但在程序结束时它会转储我的核心(如果你愿意,我可以提供特定错误,但它只是一个内存映射,然后是 aborted (core dumped)

【问题讨论】:

  • 首先请阅读how to debug small programs。然后学习如何使用rubber duck debugging 以及如何使用实际的调试器来捕捉“运行中”的崩溃。当您在调试器中捕获崩溃时,您可以了解其在代码中的位置,并检查所有相关变量的值。
  • 我已经完成了所有步骤,我已经使用了调试器,谢谢,但我真的需要更多经验的人来看看它:)
  • 那你能告诉我们崩溃发生在哪里吗?所有涉及的变量的值是多少?
  • 哦,还有一些提示:如果程序结束时发生崩溃,则可能是清理代码中的问题(如析构函数)。谈到析构函数,你有一个循环,你 delete previousPtr 但你永远不会将 previousPtr 重新分配给其他任何地方......如果你在调试器中单步执行你的代码,最后一件事将是 very 显而易见。
  • 崩溃发生在程序的末尾,它输出 data: 1 data: 2 1 2 然后进入内存映射然后aborted (core dumped)

标签: c++ linked-list coredump


【解决方案1】:

我修好了!谢谢一些程序员老兄!所以问题出在我的解构器上,我所做的是将previousPtr-&gt;next = nullptr; 更改为previousPtr = previousPtr-&gt;next;

【讨论】:

  • 它被称为“析构函数”,而不是“解构函数”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 2017-07-19
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 2015-04-17
相关资源
最近更新 更多