Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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++代码。因为内存是动态分配的,所以应该在堆上进行分配。或者,由于内存是在声明时分配的,而不是在任何构造函数中,所以它是在堆栈上分配的吗?我需要反构造函数来释放内存吗 class param{ public: char* st = new char[256]; };_C++_Memory_Memory Management - Fatal编程技术网

内存分配在哪里?堆还是堆栈? 我有下面的C++代码。因为内存是动态分配的,所以应该在堆上进行分配。或者,由于内存是在声明时分配的,而不是在任何构造函数中,所以它是在堆栈上分配的吗?我需要反构造函数来释放内存吗 class param{ public: char* st = new char[256]; };

内存分配在哪里?堆还是堆栈? 我有下面的C++代码。因为内存是动态分配的,所以应该在堆上进行分配。或者,由于内存是在声明时分配的,而不是在任何构造函数中,所以它是在堆栈上分配的吗?我需要反构造函数来释放内存吗 class param{ public: char* st = new char[256]; };,c++,memory,memory-management,C++,Memory,Memory Management,在下面的场景中会发生什么?我猜这是在堆栈上分配的,不需要使用解构器释放 class param{ public: char st[256]; }; 第三种方法是将其写成: class param{ public: char* st; param() { st = new char[256]; } ~param() { delete[] st; } }; 以上三种方法中哪一种是正确的方法 由于内存是

在下面的场景中会发生什么?我猜这是在堆栈上分配的,不需要使用解构器释放

class param{
public:
    char st[256];
};
第三种方法是将其写成:

class param{
public:
    char* st;
    param()
    {
        st = new char[256];
    }

    ~param()
    {
       delete[] st;
    }
};
以上三种方法中哪一种是正确的方法

由于内存是在声明时分配的,而不是在任何构造函数中分配的,所以它是在堆栈上分配的吗

不,它仍然是动态分配的

我需要反构造函数来释放内存吗

class param{
public:
    char* st = new char[256];
};
您正在通过
operator new[]
分配内存,因此需要调用
operator delete[]
取消分配内存

其他建议:

<> >考虑使用,因为它是C++。< /P>
  • 关于第三种情况,请参阅和


  • new
    始终在堆上分配

    在第一个示例中,将
    new
    中的指针放入类成员中

    该类的一个实例可以在堆栈上实例化;或者类的实例可以通过
    new
    在堆本身上实例化。无论类的实例以何种方式自身实例化,无论是在堆上还是在堆栈上,其成员
    st
    都将始终指向堆分配的内存

    在第二个示例中,成员
    st
    是类的一部分。在给出的示例中没有实例化任何内容。这只是一个类声明。当类的实例被实例化时,它可以在堆上或堆栈上被实例化,在这两种情况下,
    st
    成员都是类的一部分,并且与特定的类实例一起被实例化

    至于哪种方法是“正确的”,这三个例子都可能是正确的。或者他们三个都可能错了。这完全取决于类的使用方式。一般来说,第二个或第三个示例是最方便的实现方式,并且不会带来太多惊喜


    但是,即使第一个例子是正确的,也有可能出现一些深奥的情况。

    第三种情况不好:它不符合3/5/0的规则。@zenith Specific to OP'问题,与第一种情况相比,应该可以。无论如何,我删除了它,因为它不准确。对valgrind运行第一个版本表明内存泄漏,所以它在堆上分配。你必须在以后手动删除某个地方,这是非常脆弱的。第二种或第三种方法都是有效的方法。对于第三种方法,请确保提供合适的(或已删除的)复制和移动构造函数和赋值运算符,以确保正确处理内存所有权。实际上,这些都没有任何意义。使用<代码> STD::向量或 STD::数组。没有按照C++标准在正确的术语中堆的东西。