2010-04-27 63 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是字符的缓冲区(注意复数),并将它所读取的内容放入您分配的单个字符中,然后将其放入由谁知道是什么的内存中。

结果通常被称为“未定义的行为” - 有时您会像第一次实例一样逃避,而其他时候您不会如第二次转换那样。