-1
Homework 2(11785,0x100082000) malloc: *** error for object
enter code here0x73203a296b636f6c: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
d c b a (lldb)
このエラーは、デバッガでコードをステップ実行した場合には発生しませんが、問題の原因を見つけるのに苦労します。また、プログラムを実行するたびに発生することはありませんが、コードをまったく変更しない場合でも時々発生します。これは、main、b = aの代入演算子を呼び出すときにのみ発生します。ランタイムmalloc:***エラーは時々発生するだけです
#include <iostream>
#include <string>
using namespace std;
typedef string ItemType;
class LinkedList {
private:
struct Node {
ItemType value;
Node *next;
};
Node *head;
int m_size;
public:
// default constructor
LinkedList() : head(nullptr) {
m_size = 0;
}
// copy constructor
LinkedList(const LinkedList& rhs){
head = nullptr;
Node *p = nullptr;
for (Node* n = rhs.head; n != nullptr; n = n->next)
{
Node* newNode = new Node;
newNode->value = n->value;
if (p != nullptr)
p->next = newNode;
if (head == nullptr)
head = newNode;
p = newNode;
}
m_size = rhs.m_size;
}
// Destroys all the dynamically allocated memory
// in the list.
~LinkedList(){
Node* n = head;
Node* prev = nullptr;
while (n != nullptr) {
prev = n;
n = n->next;
delete prev;
}
}
// assignment operator
const LinkedList& operator=(const LinkedList& rhs){
LinkedList *copy = new LinkedList (rhs);
head = copy->head;
m_size = copy->m_size;
return *this;
}
// Inserts val at the front of the list
void insertToFront(const ItemType &val){
Node* currentHead = head;
head = new Node;
head->value = val;
head->next = currentHead;
m_size++;
}
// Prints the LinkedList
void printList() const{
Node* n = head;
while (n != nullptr)
{
cout << n->value;
n = n->next;
}
}
int main(){
LinkedList a;
a.insertToFront(" a ");
a.insertToFront(" b ");
a.insertToFront(" c ");
a.insertToFront(" d ");
a.printList();
LinkedList b;
b = a;
return 0;
}
スタックオーバーフローをデバッガと混同しないでください。彼らはあなたがどこを見るかを知っていれば詳細な報告をします。 – tadman
私はあなたが何を言っているのか理解していますが、運が悪いので、何時間も問題を掘り下げようとしました。あなたがコードからかなり明白に分かるように、これは宿題であり、このエラーは、私が期日が近づいているはるかに大きな課題の残りを終えることを妨げています。初心者として、私はこの難しいハードルを克服するために誰かが私を助けてくれることを望んでいたので、残りのコードを続けます。 – NickR
@NickR、Linuxには、メモリデバッガー、Valgrindがあります。 'valgrind。/ your_program'で試してみると、多くのメモリ管理エラーが検出されます。あるいは、メモリを割り当てて解放するすべての場所で、 'stderr'(または' std :: cerr'に '' '')にデバッグ 'fprintf'sを追加してみてください。あなたはnew-edでないものに対してdeleteを呼び出すことはできません。 – osgx