[英]error: Cannot access memory at address
我試圖從派生類中的函數返回指針,這是代碼:
A級
class A {
protected:
C c;
public:
virtual void func(){
unsigned char *data;
int size=getData(data);
}
}
B級
class B : public A {
private:
int size;
public:
B(const C &_c) { c=_c; };
const int B::getData(unsigned char *data) const {
data=(unsigned char *)malloc(size);
memcpy(data,c.getMem(),size);
if(!data){
//err
}
return size;
}
C級
class C {
private:
unsigned char *mem;
public:
C(unsigned char *_mem) : mem(_mem);
const unsigned char *getMem() const { return mem; };
}
main.cpp
C c(...);
B *b=new B(c);
b->func();
getData返回時出現的錯誤
(this=0x50cdf8, data=0x2 <error: Cannot access memory at address 0x2>, size=32)
謝謝。
在class A
, func()
一文不值,因為:
1. size
不返回給調用者。
2.指針data
是func
本地data
,在func()
中執行結束后,其內容將消失。
您不需要從函數返回const int
。 函數將返回變量的副本 ,因此它們是常量(副本)。
不要在C ++中使用malloc
,請使用operator new
。 malloc
函數不會調用對象的構造函數。
除非絕對必要,否則不要使用new
或malloc
。 通常,動態內存用於在編譯時不知道其容量的容器。 或對於超出功能或語句塊的執行時間的對象。 如果必須使用動態內存,請使用智能指針(例如boost::shared_ptr
)。
將std::vector
用於動態數組。 有用; 已經過測試; 您不必編寫自己的文件,包括內存管理。
您正在按值(指針的副本)傳遞data
。 如果要修改指針,請按引用傳遞該指針或將指針傳遞給該指針; (我稱之為指針的地址)。
例:
void my_function(uint8_t * & p_data)
{
p_data = new uint8_t[512];
}
要么
void another_function(unsigned char * * pp_data)
{
*pp_data = new unsigned char [1024];
}
更好的解決方案:
void better_function(std::vector<uint8_t>& data)
{
data.reserve(64);
for (uint8_t i = 0; i < 64; ++i)
{
data[i] = i;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.