C++;-指向对象的指针数组,堆栈中存储了什么,堆中存储了什么? 我对C++非常陌生,我希望用操作符“new…”和操作符“删除…”来说明内存管理的一些要点。
我将发布我的一些代码,我问如果我的评论是错误的,你是否可以纠正我的评论 我也在处理虚拟函数和接口,这一点通过阅读代码就很清楚了,我还问你我是否以正确的方式处理它们 然后我有一个更直接的问题,我应该在什么时候使用“new[…”或“delete[…”,以及如何正确使用它们 PS:以下代码的输出为:C++;-指向对象的指针数组,堆栈中存储了什么,堆中存储了什么? 我对C++非常陌生,我希望用操作符“new…”和操作符“删除…”来说明内存管理的一些要点。,c++,arrays,pointers,stack,heap,C++,Arrays,Pointers,Stack,Heap,我将发布我的一些代码,我问如果我的评论是错误的,你是否可以纠正我的评论 我也在处理虚拟函数和接口,这一点通过阅读代码就很清楚了,我还问你我是否以正确的方式处理它们 然后我有一个更直接的问题,我应该在什么时候使用“new[…”或“delete[…”,以及如何正确使用它们 PS:以下代码的输出为: car built motorcycle built car has 4 wheels motorcycle has 2 wheels car destroyed motorcycle destroyed
car built
motorcycle built
car has 4 wheels
motorcycle has 2 wheels
car destroyed
motorcycle destroyed
这是main.cpp的来源:
#include <iostream>
using namespace std;
class vehicle
{
public:
virtual
~vehicle()
{
}
virtual void
wheelNum() = 0;
};
class car : public vehicle
{
public:
car()
{
cout << "car built" << endl;
}
~car()
{
cout << "car destroyed" << endl;
}
void
wheelNum()
{
cout << "car has 4 wheels" << endl;
}
};
class motorcycle : public vehicle
{
public:
motorcycle()
{
cout << "motorcycle built" << endl;
}
~motorcycle()
{
cout << "motorcycle destroyed" << endl;
}
void
wheelNum()
{
cout << "motorcycle has 2 wheels" << endl;
}
};
int
main()
{
// motorVehicle[2] is allocated in the STACK and has room for 2 pointers to vehicle class object
// when I call "new ...", I allocate room for an object of vehicle class in the HEAP and I obtain its pointer, which is stored in the STACK
vehicle* motorVehicle[2] = { new (car), new (motorcycle) };
for (int i = 0; i < 2; i++)
{
// for every pointer to a vehicle in the array, I access the method wheelNum() of the pointed object
motorVehicle[i] -> wheelNum();
}
for (int i = 0; i < 2; i++)
{
// given that I allocated vehicles in the HEAP, I have to eliminate them before terminating the program
// nevertheless pointers "motorVehicle[i]" are allocated in the STACK and therefore I don't need to delete them
delete (motorVehicle[i]);
}
return 0;
}
#包括
使用名称空间std;
等级车辆
{
公众:
事实上的
~vehicle()
{
}
虚空
wheelNum()=0;
};
车辆类别:公共车辆
{
公众:
汽车()
{
cout使用new
分配的内存在堆上,其他所有内存都在堆栈上。因此,在代码中,您有
vehicle* motorVehicle[2] = { new (car), new (motorcycle) };
在堆栈上有两个指针数组vehicle*[2]
,在堆栈上有两个对象,一个car
和一个motorcycle
然后有两个循环
for (int i = 0; i < 2; i++)
for(int i=0;i<2;i++)
在循环期间,每一个都在堆栈上创建一个整数。使用new
分配的内存在堆上,堆栈中的所有其他内存都在堆上。因此,在代码中,您有
vehicle* motorVehicle[2] = { new (car), new (motorcycle) };
在堆栈上有两个指针数组vehicle*[2]
,在堆栈上有两个对象,一个car
和一个motorcycle
然后有两个循环
for (int i = 0; i < 2; i++)
for(int i=0;i<2;i++)
每个指针在循环期间在堆栈上创建一个整数。关于代码:指针数组是一个局部变量,
将在堆栈上分配。指针指向它们的是什么
在你的例子中,selfs指向的是分配的
动态地(在堆上)
关于“更直接的问题”:我还没有找到任何案例
其中应使用new[]
。它的出现是因为
完整性,但它实际上没有任何合理的用途。关于您的代码:指针数组是一个局部变量,
将在堆栈上分配。指针指向它们的是什么
在你的例子中,selfs指向的是分配的
动态地(在堆上)
关于“更直接的问题”:我还没有找到任何案例
其中应使用new[]
。它的出现是因为
完整性,但它实际上没有任何合理的用途。对于每一个新t
,您需要一个删除
,对于每一个新t[…]
,您需要删除[]你的代码看起来很好。你所发布的代码工作很好。考虑使用智能指针,例如“代码> STD::SyrdYPPTR < /代码>或<代码> STD::UnQuijPPTR <代码>,以管理你的堆分配内存的寿命。如果我用新的[/]分配了MevVikle [2 ]会怎么样??我是否应该声明指向指针数组的指针?否,new[]
返回指向第一个元素的指针,因此您仍然应该声明指向车辆的指针:vehicle*p=new vehicle[2];
。请记住使用delete[]删除它
。如果要分配数组,您需要一个指向数组的指针:int(*p)[5]=new int[5][x];
@iMineLink您不应该这样做。什么场景需要一个new[]
?对于每一个新的t
,您需要一个删除,对于每一个新的t[…]
,您需要删除[]你的代码看起来很好。你所发布的代码工作很好。考虑使用智能指针,例如“代码> STD::SyrdYPPTR < /代码>或<代码> STD::UnQuijPPTR <代码>,以管理你的堆分配内存的寿命。如果我用新的[/]分配了MevVikle [2 ]会怎么样??我是否应该声明指向指针数组的指针?否,new[]
返回指向第一个元素的指针,因此您仍然应该声明指向车辆的指针:vehicle*p=new vehicle[2];
。请记住使用delete[]删除它
。如果要分配数组,则需要指向数组的指针:int(*p)[5]=new int[5][x];
@iMineLink您不应该这样做。什么场景需要new[]
?在静态情况下,比如我发布的,你是对的,但是如果我想在运行时分配我的数组呢?根据一些Java经验,你可以使用:Object[]array=new Object[n];
(你可以使用ArrayList,这是正确的,但是让垃圾收集器做一些工作…)和从C中:int*p;p=calloc(sizeof)这里,我认为使用NeX[]的更直接的方法是,然后删除[]……但是如果你说使用它不是很合理的话,应该用什么来代替动态内存管理?@ imielink有一个动态分配的数组,使用<代码> STD::vector < /C> >。C++不是java;C++默认有值语义。(在Java中,无论使用ArrayList
还是newobject[n]
都不会改变垃圾收集器的任何内容。)也许,更重要的是:C++和java之间的一个重要区别是C++中除了你真正需要的时候,C++中不使用动态分配。实际上,除了实体对象类型,你不需要它,它具有身份,并且可能是(可能的)。多态。数组不是实体对象类型。在静态情况下,比如我发布的情况,你是对的,但是如果我想在运行时分配数组呢?来自一些Java经验,你使用:object[]array=new object[n];
(你可以使用ArrayList,这是正确的,但是允许垃圾收集器做一些工作…)从C中:int*p;p=calloc(sizeof(int),n);
这里我认为更直接的方法是使用new[],然后删除[]