Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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++ - Fatal编程技术网

C++ 当堆中已经分配了对象的内部内存时,我们是否应该为堆中的对象分配内存?

C++ 当堆中已经分配了对象的内部内存时,我们是否应该为堆中的对象分配内存?,c++,C++,如果我使用std::vector或std::string,我是否也需要在堆中分配它们。例如: int main() { std::vector<int>* p = new std::vector<int>(); delete p; } intmain(){ std::vector*p=新的std::vector(); 删除p; } 在Java和C#中,对象总是使用这种语法在堆中分配。我想知道在C++中做同样的事情是否有效?因为每当我在C++中创建一个类

如果我使用std::vector或std::string,我是否也需要在堆中分配它们。例如:

int main() {
    std::vector<int>* p = new std::vector<int>();
    delete p;
}
intmain(){
std::vector*p=新的std::vector();
删除p;
}
在Java和C#中,对象总是使用这种语法在堆中分配。我想知道在C++中做同样的事情是否有效?因为每当我在C++中创建一个类时,我通常在堆栈和堆变量之间进行混合。比如说:

class simple {
    int a;
    double b;
    std::string c;
    std::vector<int> d;
    ....
};
简单类{
INTA;
双b;
std::字符串c;
std::载体d;
....
};
我想知道在C++中使用对象时,我应该遵循什么样的最佳实践?
  • 所有数据都应该在堆上分配
  • 所有数据都可能是混合的
  • 或者
谢谢,

Chan

我尽可能地分配堆栈上的对象,因为在这种情况下我不必担心释放内存。只有当我明确地想要控制对象的生命周期时,我才会在堆上分配对象。即使对象在堆上内部分配内存,您仍然可以在堆栈上创建对象本身。这方面没有限制。

我尽可能在堆栈上分配对象,因为在这种情况下我不必担心释放内存。只有当我明确地想要控制对象的生命周期时,我才会在堆上分配对象。即使对象在堆上内部分配内存,您仍然可以在堆栈上创建对象本身。这方面没有限制。

没有;通常,除非变量的生存期超过函数的生存期,否则使用堆栈

容器类将从堆中分配自己的内存;堆栈上唯一的数据是容器类需要的任何簿记数据,例如指向头部、大小等的指针


此外,我建议避免手动新建/删除和使用共享的ptr等技术。

否;通常,除非变量的生存期超过函数的生存期,否则使用堆栈

容器类将从堆中分配自己的内存;堆栈上唯一的数据是容器类需要的任何簿记数据,例如指向头部、大小等的指针


此外,我建议避免手动新建/删除和使用共享的ptr等技术。

您应该避免在堆栈上创建大尺寸的对象,因为测试很少会发现偶然的堆栈压力溢出(大输入数据),因此最终用户会对软件崩溃感到不快

关于字符串和向量以及其他STL容器,您不必担心,因为它们在内部使用动态分配。所以答案是否定的,将它们构造到堆栈中是安全的,动态地分配它们通常是过分的

可能危险的是静态大小的数组,这些数组包含boost::array之类的数组,或者包含数据成员之类的类。专家们经常使用pimpl习惯用法使他们的类在内部是动态的


堆栈速度非常快,但只在真正有利于性能的地方使用它的速度。小心点比较安全。避免使用危险的习惯用法,如“我在堆栈上分配所有内容”

您应该避免在堆栈上创建大尺寸的对象,因为测试很少会发现偶然的堆栈压力溢出(大输入数据),因此最终用户会因为软件崩溃而不高兴

关于字符串和向量以及其他STL容器,您不必担心,因为它们在内部使用动态分配。所以答案是否定的,将它们构造到堆栈中是安全的,动态地分配它们通常是过分的

可能危险的是静态大小的数组,这些数组包含boost::array之类的数组,或者包含数据成员之类的类。专家们经常使用pimpl习惯用法使他们的类在内部是动态的


堆栈速度非常快,但只在真正有利于性能的地方使用它的速度。小心点比较安全。避免使用危险的习惯用法,如“我在堆栈上分配所有内容”

实际上,对象不一定在堆上使用C#中的语法。如果是值类型,它将进入堆栈。实际上,在C#中,对象不一定在堆上使用该语法。如果它是一个值类型,它将进入堆栈。+1关于安全的好建议。我开发的一个平台将新pthread线程的默认堆栈大小设置为64K。我曾经犯过一个新手错误,在堆栈上分配过大的缓冲区,这会导致出现各种奇怪的错误。+1关于安全的好建议。我开发的一个平台将新pthread线程的默认堆栈大小设置为64K。我曾经犯过一个新手的错误,在堆栈上分配过大的缓冲区,这会导致各种奇怪的错误出现。