错误:无法访问地址处的内存

时间:2015-08-07 17:15:37

标签: c++

我正在尝试从派生类中的函数返回指针, 这是代码:

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)

感谢。

1 个答案:

答案 0 :(得分:0)

class A中,func()毫无价值,因为:
1. size不会返回给来电者 2.指针datafunc的本地指针,它的内容将在func()执行结束后消失。

您无需从函数返回const int。函数将返回变量的副本,因此它们是常量(副本)。

请勿在C ++中使用malloc,请使用operator newmalloc函数不调用对象的构造函数。

除非绝对必要,否则请勿使用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;
  }
}