Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;-指向对象的指针数组,堆栈中存储了什么,堆中存储了什么? 我对C++非常陌生,我希望用操作符“new…”和操作符“删除…”来说明内存管理的一些要点。_C++_Arrays_Pointers_Stack_Heap - Fatal编程技术网

C++;-指向对象的指针数组,堆栈中存储了什么,堆中存储了什么? 我对C++非常陌生,我希望用操作符“new…”和操作符“删除…”来说明内存管理的一些要点。

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

我将发布我的一些代码,我问如果我的评论是错误的,你是否可以纠正我的评论

我也在处理虚拟函数和接口,这一点通过阅读代码就很清楚了,我还问你我是否以正确的方式处理它们

然后我有一个更直接的问题,我应该在什么时候使用“new[…”或“delete[…”,以及如何正确使用它们

PS:以下代码的输出为:

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[],然后删除[]