尝试从点无符号字符获取数据时出现分段错误

问题描述:

我在C++中遇到了有关指针的问题。我有一个类CData,允许设置数据unsigned char pointer。我成功地在setData()函数中设置了一个随机指针数组。现在,我想在getData函数中显示数据。但是,它的错误是Segmentation fault (core dumped)。你能看看我的代码,请给我解决方案。由于尝试从点无符号字符获取数据时出现分段错误

这是我的电流输出

Input is generated by random: 
    103 198 105 115 81 255 74 236 

Get input data: 
Segmentation fault (core dumped) 

这是我的全部代码。您可以在构建时无误地运行它。

#include <iostream> 
#include <stdio.h> 
#include <vector> 
#include <stdlib.h> 
#include <string.h> 
#include <queue> 
#define random(x) (rand()%x) 
typedef unsigned char U8, *PU8; 
typedef unsigned int U32, *PU32; 
using std::vector; 
using std::queue; 

class CData 
{ 
private: 
    U8* m_Data; 
    U32 m_Len; 
public: 

    CData(void): m_Data(NULL), m_Len(0) 
    { 
    } 
    ~CData(void) 
    {  
    } 
    CData(U8* data, U32 len): m_Data(NULL), m_Len(0) {SetData(data, len);}; 
    void FreeData() 
    { 
    if (m_Data) 
    { 
     delete[] m_Data; 
     m_Data = NULL; 
    } 
    } 
    void SetData(const U8* data, U32 len) 
    { 
    FreeData(); 
    if (len > 0 && data) 
    { 
     m_Data = new U8[len]; 
     memcpy(m_Data, data, len); 
     m_Len = len; 
    } 
    } 

    U8 *GetData(void) const { return m_Data; } 
    U32 GetLen(void) const { return m_Len; } 

}; 

queue<CData*> setData() 
{ 
    printf("\nInput is generated by random:\n"); 
    U32 index = 0; 
    int k=8; 
    U32 dataLen=1; 
    U8 *buf = new U8[dataLen]; 
    queue<CData*> res; 
    for (U32 i = 0; i < k; ++i) 
    { 
    vector<U8> rndData; 
    rndData.reserve(dataLen); 
    for (U32 j = 0; j < dataLen; ++j) 
    { 
     rndData.push_back(random(256)); 
     index++; 
     printf("%6d", rndData[j]); 
     buf[j] = rndData[j]; 
    } 
    CData data(buf, dataLen); 
    res.push(&data); 
    } 
    printf("\n"); 
    delete [] buf; 
    buf = NULL; 
    return res; 
} 

void getData(queue<CData*> res_in) 
{ 
    printf("\nGet input data:\n"); 
    vector<U8> out_data; 
    U8 *buf =NULL; 
    while (!res_in.empty()) 
    {  
    CData* data = res_in.front();  
    buf =data->GetData(); 
    int data_size = data->GetLen(); 
    for (int j = 0; j < data_size; ++j) 
    {  
     out_data.push_back(buf[j]); 
    } 
    res_in.pop(); 
    } 
    //Print output data 
    for (int j = 0; j < out_data.size(); ++j) 
    {  
    printf("%6d ",out_data[j]); 
    } 
    delete [] buf; 
    buf = NULL; 
} 

int main(int argc, char **argv) { 
    queue<CData*> res_in=setData(); 
    getData(res_in); 
    return 0; 
} 

你推到队列中一个指向本地对象(在栈上创建):

for (U32 i = 0; i < k; ++i) 
{ 
    //... 
    CData data(buf, dataLen);  // CData object created on the stack 
    res.push(&data);    // A pointer to this object is pushed to the queue 
}         // CData object is destroyed, as we goes out of scope 
+0

哪里是我弄错了?它在setData函数中,对吗?但是,它看起来很喜欢setData函数。 – Jame

+0

@ user8430是的。您需要在堆上创建CData对象。 – Stas

+0

你能帮我解决吗?我尝试过,但不起作用。我在 – Jame