我正在尝试从派生类中的函数返回指针, 这是代码:
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)
感谢。
答案 0 :(得分:0)
在class A
中,func()
毫无价值,因为:
1. size
不会返回给来电者
2.指针data
是func
的本地指针,它的内容将在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;
}
}