Bug在我的代码内存操作



我不确定我是否可以在这里发布这些类型的问题,请让我知道你的想法,如果有必要,我可以删除帖子。

我正在尝试一些C风格的代码,但我很难找到我的bug。有人能看出这个错误吗?

注意:我知道有一些内存泄漏(我将稍后修复)

#include <cstdlib>
#include <iostream>
#include <string.h>
using namespace std;
size_t returnSize(const char* s)
{
       string string(s);
       return string.size();
};
size_t returnSize(const int& i)
{
       return sizeof(i);
};
size_t returnSize(const char& c)
{
    return sizeof(char);   
};
template<typename T>
string Serialize(const T& t)
{
    T* pt = new T(t);
    char CasttoChar[returnSize(t)];
    for (int i =0 ;i<returnSize(t);i++)
    {
        CasttoChar[i] = (reinterpret_cast<const char*>(pt)[i]);
    }
    char* pX = (char*)malloc(sizeof(char) * (returnSize(t) + 1));
    // I save size in byte 0 
    pX[0] = (char)returnSize(t);
    //I save value in subsequent bytes.
    for (int i = 1 ; i<=returnSize(t) ; i++)
    { 
        pX[i] = CasttoChar[i];                         
    }
    string returnString(pX);
    free(pX);
    return returnString;     
};
template<typename T>
T DeSerialize(const string& s)
{
     const char * cstr = s.c_str();
     int sizeofData = (int)cstr[0];
    char* cp = (char*)malloc(sizeof(char) * sizeofData);
    for (int i =0 ;i<sizeofData;i++)
    { 
        cp[i] = cstr[i];                          
    }
    T* result= reinterpret_cast<T*>(cp);
    return *result;
}
int main(int argc, char *argv[])
{
    int x = 10;
    string s = Serialize(x);
    cout << DeSerialize<int>(s);
  /*    
    I need to see: 
    10 as output
    now I see 4
  */    
    system("PAUSE");
    return EXIT_SUCCESS;
}

所以基本上我序列化了数字10当我反序列化时,我得到了4

你正在复制错误的字节:

for (int i =0 ;i<sizeofData;i++)
{ 
    cp[i] = cstr[i];                          
}

由于cstr[0]是长度,它应该是:

for (int i =0 ;i<sizeofData;i++)
{ 
    cp[i] = cstr[i+1];                          
}

[同时,你需要确保你的字符串的长度不超过128!)

哦,更进一步:将char*传递给std::string假设您的字符串是c风格字符串。所以如果你的字符串中有一个零字节,它将无法工作。最好使用一个只有长度和动态分配的字符数组的数据结构。

我也相信你会从std::string类型复制错误的字节,因为你只是简单地将字符串的地址转换为char *,这是"对象std::string",而不是实际的字符串内容-你需要"c_str()"。

bug来源之一:

string s = Serialize(x);
应该

string s = Serialize<int>(x);

最新更新