2017-12-05 8 views
-2

私はこのエラーが発生しており、コードエディタでエラーが発生していないので修正方法がわかりません。私は同様の問題を探しましたが、ここで解決策を適用する方法を理解するのはまだ難しいです。私は数時間、私のコードを変更しようとしましたが、役に立たない。どんな助けもありがとう。私は下記の.hと.cppファイルを提供しています。*** glibcが検出されました*** ms2:free():無効なポインタ:0xb7526ff4 ***

ErrorMessage.h

#ifndef SICT_ERRORMESSAGE_H 
#define SICT_ERRORMESSAGE_H 
#include <iostream> 

namespace sict { 
    class ErrorMessage { 
     char* message_; //pointer that holds the address of the message stored in current object 
    public: 
     explicit ErrorMessage(const char* errorMessage = nullptr); //receive address of a C-style nullterminate string holding an error message 
     ErrorMessage(const ErrorMessage& em) = delete; //deleted copy constructor that prevents copying of an ErrorMessage object 
     ErrorMessage& operator=(const ErrorMessage& em) = delete; //deleted assignment operator that prevents assignment of ErrorMessage object to current object 
     virtual ~ErrorMessage(); //deallocates any memory that has been dynamically allocated by the current object 
     void clear(); //clears any message stored by current object and initialize object to safe, empty state 
     bool isClear() const; //return true if object is in a safe, empty state 
     void message(const char* str); //stores a copy of the C-style string pointed to by str 
     const char* message() const; //return address of the message stored in current object 
    }; 
    //helper operator 
     std::ostream& operator<<(std::ostream& os, const ErrorMessage& err); 
} 
#endif 

ErrorMessage.cpp

#define _CRT_SECURE_NO_WARNINGS 
#include <iostream> 
#include <cstring> 
#include "ErrorMessage.h" 

namespace sict { 

    ErrorMessage::ErrorMessage(const char* errorMessage) { 
    if(errorMessage == nullptr) { 
     message_ = nullptr; 
    } 
    else { 
      message(errorMessage); 
    } 
    } 

    ErrorMessage::~ErrorMessage() { 
    delete [] message_; 
    } 

    void ErrorMessage::clear() { 
    delete [] message_; 
    message_ = nullptr; 
    } 

    bool ErrorMessage::isClear() const { 
     if(message_ == nullptr) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 

    void ErrorMessage::message(const char* str) { 
     delete [] message_; 
     message_ = new char[strlen(str) + 1]; 
     strcpy(message_, str); 
    } 

    const char* ErrorMessage::message() const { 
     return message_; 
    } 

    std::ostream& operator<<(std::ostream& os, const ErrorMessage& err) { 
    if(!err.isClear()) { 
      os << err.message(); 
    } 
    return os; 
    } 
} 
+1

今、実際にはC++ですが、 'std :: string'を使用する代わりに、このすべてのことを行う有効な理由はありますか? – Jack

+1

コードエディタのクリーンな健康状態は、あなたのプログラムがバグフリーであることを意味し、本当にショックを受けていると思われる場合は、また、表示されたコードよりもプログラムに多くのものがあることは明らかです。なぜあなたのコードの他の部分ではなく、示されたコードに問題があると正確に信じますか? –

+0

コードの唯一の部分はメインファイルですが、何らかの形で変更されることはありません。つまり、エラーはコード – Glaz

答えて

1

それは驚くことではありませんあなたのコードは、エディタの構文チェックとコンパイルを通じてそれを作った - それは有効なコードです。それはちょうどポインタどこかに間違っています。

これは誤ってリファレンスを参照解除しているか、ポインタを渡す必要のある値を渡している可能性があります。あなたはその種のものについてコンパイル時の警告を得るべきです。

もう1つの可能性は、ポインタの初期化に失敗していて、その値が0xb75...であることです。

明らかに、あなたも私も、このエラーの発生原因を推測することはできません。 Sam Varshavchik氏はコメントで指摘したように、投稿したコードがエラーの原因であるかどうかは分かりません。あなたがこの方法であなたのやり方を推測したとしても(またはおそらく、Samを鋭く観察する)、C++をそのように書くことはちょっとばかげているだけです。

必要なものはデバッガです。デバッガはプログラムの範囲で実行するプログラムであり、プログラムの状態を追跡し、メモリ違反が発生した場合、デバッガはバックトレースを生成し、ソースコードのどこにエラーが発生したかを示します。プログラムをデバッグサポートでコンパイルする必要があります。デバッガには、ソースコードを参照するためのマーカーがあります。

これはあなたの質問の範囲をはるかに超えるプロセスですが、あなたが何をしようとしているかを知った後は簡単に学ぶことができます。可能であれば、開発環境を大いに活用しながら、IDEと統合するものを探します。すでに設定していることはまずありません。単に使用する必要があるかもしれません。最初にエディタのコンテキストでC++のデバッグを検索します。何も表示されない場合は、コンパイラスイートの下で検索してみてください(オープンソースを使用している場合はおそらくgccを使用していますgdb)。

C/C++プログラムの内容をより正確に理解しようとしています。がんばろう。

+0

非常にうまく答えて..! – Valgrind1691

関連する問題