将char *转换为字符串时出现问题

时间:2010-04-27 15:46:18

标签: c++

当我将char *转换为字符串时,它会在'new.cpp'中出现错误的内存分配错误。我使用以下方法将名为'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);
    }

请帮我解决这个问题。这是紧急的

3 个答案:

答案 0 :(得分:4)

而不是

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

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

当您使用istringstreamread读取数据时,您提供的缓冲区必须有足够的空间来容纳结果!

如果您致电new char;,则可获得一个char的空间。使用new char[n];为n。

获取空间

答案 1 :(得分:1)




    delete [] strData;

这很糟糕。它上面的那条线可能也是,但我知道这个是。

您正在删除dt.data()。如果我没记错的话,这肯定是字符串的内部缓冲区。

这可能是您的潜在问题,也可能不是,就像我说的那样,我怀疑它上面的行也很糟糕,因为你将一个指向单个字符的指针传递给了一个似乎需要一段长度的缓冲区。

答案 2 :(得分:0)

我认为问题(或至少部分问题)在于您的分配:

char * imgData =  new char;

这只分配1个字符,然后istream.read将假设imgData是字符的缓冲区(注意复数)并将它读取的任何内容放入您分配的单个字符中,然后将其放入由此使用的内存中谁知道什么。

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