-6

私のプログラム mycpp.c はメモリ エラーをスローします。このエラーは、オブジェクト ポインターを上書きしたために発生したと思いますが、エラーの根本的な原因を突き止めることができませんでした。「ref3[1]= ref3[0]」という行が+参照;" が問題を引き起こしているのでコメントしましたが、助けにはなりませんでした。エラーの解決を手伝ってください。 mycpp.c

void mycpp::filldata(ptrStructda pStData)
   1871 {
             ../stmt/...

   1947         String s2("");
   1948         strcat(ref3[0],reference);
   1949         strcat(s2,ref3[0]);
   1950            // ref3[1]= ref3[0] +reference;
   1951             s2.replace_char('-','.');
   1952            // Clean and hold the output value
   1953             temp_Buffer->erase();
   1954         *temp_Buffer = "";
   1955         cout<<"S2:\t"<<s2<<endl;
   1956 //      strcpy(*temp_Buffer,s2);
   1957 }

文字列.c

String::String()
{
        _text = new char[1024];
}

String::String(char *ch)
{
        if (ch == NULL )
        {
                // if input char* is empty - allocate short buffer
                // and set it to ""
                _text = new char[2];
                strcpy(_text, "");
        }
        else
        {   
                _text = new char[strlen(ch) + 1];
                    if(_text)
                         strcpy(_text, ch);
                else
                {
                        _text = new char[2];
                        strcpy(_text, "");
                }
        }

}

String::String(int iLen)
{
        _text = new char[iLen+1];
}
String::String(String const & string)//jl202 added const
{
       _text = new char[string.length() + 1];

       strcpy(_text,string);
}
String::~String()
{
        delete[] _text;
}
String &String::operator=(String &ptrStr)
{

        delete[] _text;
        _text = new char[ptrStr.length() + 1];
        strcpy(_text, ptrStr);
        return *this;
}
String &String::operator=(char *ch)
{
        delete[] _text;
        _text = new char[strlen(ch) + 1];

        strcpy(_text, ch);
        return *this;
}
void String::erase()
{
        delete[] _text;
        _text = new char[1];
}

文字列.h

class String
{
    private:
            char *_text;

            friend class String_Iterator;
    public:
            // ctors and dtor
            explicit String ();                     // create String as of 1024 chars
            explicit String (char *);
            explicit String (int );
            String (String const & );               // copy ctor
            ~String();

            /////////////////
            // conversions:
            /////////////////
            //  to C-like type char *
            operator  char *() {return _text;}

            operator const char*()const
            {
               return (const_cast <char *>(_text) );
            }
 };

観測用の gdb 入力

(gdb) bt

   #5  0x0000000000402fda in String::~String (this=0x7fffffffd2f0, __in_chrg=<value optimized out>) at String.c:55
**#6  0x000000000040d58c in mycpp::filldata (this=0x61f0e0, pStData=0x7fffffffdd50) at mycpp.c:1955**
#7  0x000000000041159d in mycpp::base (this=0x61f0e0, pStData=0x7fffffffdd50, account_id=0x6418e0 "0300130",
    page_balance=0x7fffffffdf38, items_on_page=0x7fffffffdf34, txn_per_acc=0x7fffffffdf30, total_cash_bal=0x7fffffffdf28, total_cv_bal=0x7fffffffdf20)
    at mycpp.c:1328
#8  0x0000000000414e77 in mycpp::Proc (this=0x61f0e0) at mycpp.c:899
#9  0x000000000041704e in mycpp::Run (this=0x61f060) at mycpp.c:97
#10 0x0000000000417146 in main (argc=3, argv=0x7fffffffe1f8) at mycpp.c:2264

ご検討いただきありがとうございます。あなたの価値ある解決策を求めて

4

2 に答える 2

0
String s2("");
...
strcat(s2,...);

決定的に悪い考えです。char最初の行では、長さ 1の配列を割り当て、それを に割り当てs2._textます。を使用するとstrcat、文字を追加しようとしますs2._textが、追加の文字を予約していないため、書き込むべきではないメモリを上書き (破損) しています (プログラムのランダムな場所で予期しない影響を引き起こします)。の引数strcat(..)は空の文字列です。

于 2013-03-14T20:33:43.360 に答える