【发布时间】: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