簡體   English   中英

錯誤:無法訪問地址處的內存

[英]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 Afunc()一文不值,因為:
1. size不返回給調用者。
2.指針datafunc本地data ,在func()中執行結束后,其內容將消失。

您不需要從函數返回const int 函數將返回變量的副本 ,因此它們是常量(副本)。

不要在C ++中使用malloc ,請使用operator new malloc函數不會調用對象的構造函數。

除非絕對必要,否則不要使用newmalloc 通常,動態內存用於在編譯時不知道其容量的容器。 或對於超出功能或語句塊的執行時間的對象。 如果必須使用動態內存,請使用智能指針(例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM