2010-04-27 43 views
1

當我將char *轉換爲字符串時,會在'new.cpp'中給出錯誤的內存分配錯誤。我使用下面的方法將char *稱爲'strData'和'strOrg'轉換爲字符串。將char *轉換爲字符串時的問題

const char* strData = dt.data(); 
    int length2 = dt.length(); 
    string s1(strData); 

第一次工作沒有任何問題。但在第二次轉換時,它會產生上述錯誤。當我按順序交換兩個轉換時,無論我要轉換的char *如何,它都會在第二次轉換時始終給出錯誤。整個代碼如下所示。

mysqlpp::Query query = conn.query("SELECT data,origin from image where id =2"); 
    mysqlpp::UseQueryResult res = query.use(); 
    mysqlpp::Row eee= res.fetch_row(); 
    mysqlpp::Row::reference dt = eee.at(0); 
    mysqlpp::Row::reference org = eee.at(1); 

    const char* strData = dt.data(); 
    int length2 = dt.length(); 
    string s1(strData); 
    istringstream is1(s1); 
    char * imgData = new char; 
    is1.read(reinterpret_cast<char *> (imgData), length2); 
    delete [] strData; 

    const char* strOrg = org.data(); 
    int length3 = org.length(); 
    string s2(strOrg); 
    istringstream is2(s2); 
    char * imgOrg = new char; 
    is2.read(reinterpret_cast<char *> (imgOrg), length3); 
    delete [] strOrg; 

這其中的誤差來自

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc) 
    {  
    void *p; 
    while ((p = malloc(size)) == 0) 
      if (_callnewh(size) == 0) 
      {  // report no memory 
      static const std::bad_alloc nomem; 
      _RAISE(nomem); 
      } 

    return (p); 
    } 

請幫我解決這個問題。這是迫切

+0

你有沒有嘗試過在調試器中查看發生了什麼? – 2010-04-27 15:48:13

+0

你能否澄清你的目標是什麼?你目前的代碼中充滿了**答案中提到的**不同的錯誤。如果您需要將數據從MySql查詢轉換爲std :: string,請查看http://tangentsoft.net/mysql++/doc/html/refman/classmysqlpp_1_1String.html#a30 – SergGr 2010-04-27 15:59:37

回答

4

而不是

char * imgData = new char; 
is1.read(reinterpret_cast<char *> (imgData), length2); 

嘗試

char * imgData = new char[length2]; 
is1.read(reinterpret_cast<char *> (imgData), length2); 

當你使用read讀取的數據istringstream,你提供的緩衝區必須有足夠的空間來保存結果!

如果您撥打new char;,您將獲得一個空間char。使用new char[n];獲得n的空間。

+0

Ohh ..太棒了,它工作正常..: ) 感謝您的幫助 – ganuke 2010-04-27 16:28:07

1



    delete [] strData; 

這很糟糕。它上面的線可能也是,但我知道這是一個。

您正在刪除dt.data()。如果我沒有記錯,這是保證字符串的內部緩衝區。

這可能是也可能不是你的潛在問題,就像我說過的,我懷疑它上面的代碼行也是壞的,因爲你將一個指向單個字符的指針傳遞給了似乎期望有一定長度的緩衝區。

+0

嗯..我明白了。不管怎樣,謝謝 – ganuke 2010-04-27 16:29:40

0

我相信問題(或問題的至少一部分)在於你的配置:

char * imgData = new char; 

這僅分配1個字符,然後istream.read假定imgData是字符的緩衝區(注意複數),並將它所讀取的內容放入您分配的單個字符中,然後將其放入由誰知道是什麼的內存中。

結果通常被稱爲「未定義的行爲」 - 有時您會像第一次實例一樣逃避,而其他時候您不會如第二次轉換那樣。