-2

この種の質問をここに投稿できるかどうかわかりません。ご意見をお聞かせください。必要に応じて投稿を削除できます。

C スタイルのコードをいくつか試していますが、バグを見つけるのに苦労しています。誰でも間違いを見ることができますか?

注:メモリリークがほとんどないことはわかっています(後で修正します)

#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 になります。

4

2 に答える 2

1

間違ったバイトをコピーしています:

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のサイズを超えないようにする必要があります!]

ああ、さらに:achar*をaに渡すstd::stringと、文字列がCスタイルの文字列であると想定されます。したがって、文字列にゼロバイトがある場合、それは機能しません。長さと動的に割り当てられたchar配列だけのデータ構造を持つ方がよい場合があります。

また、文字列のアドレスをchar *にキャストしているだけなので、型から間違ったバイトをコピーすると思いますstd::string。これは、実際の文字列の内容ではなく、「オブジェクトstd :: string」です。「c_str( )」そのため。

于 2013-01-13T00:06:33.003 に答える
0

バグの1つの原因:

string s = Serialize(x);

する必要があります

string s = Serialize<int>(x);
于 2013-01-13T00:07:28.790 に答える