我无法返回指向对象数组的指针,特别是如何定义返回类型,我只是无法获得指针返回...
month* year()
{
month* p;
month arr[12] = { month(31), month(28), month(31), month(30), month(31), month(30), month(31), month(31), month(30), month(31), month(30), month(31) };
p = arr;
return p;
}
我也一直在试验,我担心即使我让它返回,我还可以从主要访问对象吗?这只允许我访问我选择的第一个元素(不是第一个元素,我首先尝试访问),并且不会给我内容:
int** createArray()
{
int n1 = 1;
int n2 = 2;
int n3 = 3;
int* p[3];
p[0] = &n1;
p[1] = &n2;
p[2] = &n3;
int** j = p;
return j;
}
int main()
{
int** point = createArray();
*point[2] = 5;
cout << *point[1] << endl;
cout << *point[2] << endl;
}
更新:我应该提到我必须在我的课程中使用此项目中的数组和指针。我理解我的(愚蠢的)关于局部变量的错误,但即使我把它变成一个类,我对返回类型也有同样的问题:
class create {
public:
month* GetArr();
create();
private:
month arr[12];
month* arrP;
};
create::create(){
month arr[12] = { month(31), month(28), month(31), month(30), month(31), month(30), month(31), month(31), month(30), month(31), month(30), month(31)};
month* arrP = arr;
}
month* create::GetArr()
{
return arrP;
}
答案 0 :(得分:1)
您遇到的问题是您返回指向本地对象的指针,并且一旦您的函数结束该对象就会被销毁,因此指针指向垃圾。
month* year()
{
month* p;
month arr[12] = { month(31), month(28), month(31), month(30), month(31), month(30), month(31), month(31), month(30), month(31), month(30), month(31) };
p = arr;
return p;
}
year()
结束后,arr
无效。您想要使用的是std::vector
:
std::vector<month> year()
{
std::vector<month> months = { month(31), month(28), month(31), month(30), month(31), month(30), month(31), month(31), month(30), month(31), month(30), month(31) };
return months;
}
现在,您将把容器退回所有月份:
struct month
{
month(int d) : days(d) {}
int numberOfDays() const { return days; }
private:
int days;
};
int main()
{
auto months = year();
for (auto m : months)
std::cout << "Days in month: " << m.numberOfDays() << std::endl;
}
答案 1 :(得分:0)
如何归还记忆没有问题。问题是您返回的指针指向在该函数的局部变量空间(称为其堆栈帧)中创建的变量。当您退出该函数时,该堆栈帧被“销毁”,您将无法再访问它。实际上它实际上并没有被破坏,这就是为什么你可以访问它(但这是非常危险的)。要解决这个问题,你必须创建一些不在函数堆栈框架内的内存,然后返回指向它的指针。
以下是动态记忆的一些很好的解释: