编程语言书籍解释了在堆栈上创建了值类型,并且在堆上创建了引用类型,而没有解释这两者是什么.我还没有看清楚这个问题.我理解堆栈是什么.但,
language-agnostic heap stack memory-management dynamic-memory-allocation
我在C++中看到有多种方式来分配和释放数据,我知道当你打电话给malloc你时应该打电话free,当你使用new操作员时你应该配对,delete将两者混合是错误的(例如,调用free()创建的东西)与new操作员),但我不知道何时应该使用malloc/ free何时应该在我的真实世界程序中使用new/ delete.
如果您是C++专家,请告诉我您在此方面遵循的任何经验法则或惯例.
我正在审查其他人使用MPI进行高性能计算(10 ^ 5 - 10 ^ 6核心)的项目的C++代码.该代码旨在允许不同体系结构上(可能)不同机器之间的通信.他写了一条评论,说的是:
我们通常使用
new和delete,但在这里我正在使用malloc和free.这是必要的,因为一些编译器在new使用时将以不同方式填充数据,从而导致在不同平台之间传输数据时出错.这不会发生malloc.
这与我从标准newvs malloc问题中所知道的任何内容都不符合.
new/delete和malloc/free有什么区别?提示编译器可以不同地计算对象的大小(但那么为什么它与使用不同sizeof?).
malloc&placement new vs. new是一个相当受欢迎的问题,但只讨论new使用构造函数而malloc不是,这与此无关.
malloc如何理解对齐?他说保证记忆与任何一个new或者malloc我之前想过的一致.
我的猜测是,他在过去的某个时间误诊了自己的错误并推断出new并malloc提供不同数量的填充,我认为这可能不是真的.但我无法通过谷歌或以前的任何问题找到答案.
帮助我,StackOverflow,你是我唯一的希望!
"new"和"malloc"和"calloc"和其他家庭有什么区别?
(何时)除了"新"之外我还需要什么?
其中一个是否使用其他任何一个实现?
考虑:
char *p=NULL;
free(p) // or
delete p;
Run Code Online (Sandbox Code Playgroud)
如果我使用free和delete开启会发生什么p?
如果程序需要很长时间才能执行,比如10分钟,有没有办法将其运行时间减少到5分钟?
C++有几个功能来获取动态存储,其中大部分功能在某些基本方面有所不同.OS通常会添加几个.
由于它们的便携性和相似性,其中两个特别感兴趣:malloc和::operator new.
全局void* operator new(size_t, ::std::nothrow&)和void* malloc(size_t)?之间是否有任何差异(标准和实施)?
由于我所说的似乎有些混乱,请考虑以下两个调用:
void* p = ::std::malloc(10);
void* q = ::operator new(10, ::std::nothrow);
Run Code Online (Sandbox Code Playgroud)
明显和微不足道的区别在于如何释放内存:
::std::free(p);
::operator delete(q);
Run Code Online (Sandbox Code Playgroud)
注意:这个问题不重复,例如new/delete和malloc/free有什么区别?因为它谈到使用实际上不执行任何ctor调用的全局 operator new.
我有两个关于new运算符的问题:
新操作员是否无法分配内存?
如果确实有一个对象被创建,那么每次使用new后都应该进行一次测试吗?
我认为在重新分配动态分配的指针时,我们都理解删除的必要性,以防止内存泄漏.但是,我很好奇,C++在多大程度上强制要求使用delete?例如,采取以下计划
int main()
{
int* arr = new int[5];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然所有意图和目的都没有发生泄漏(因为你的程序结束了,操作系统会在它返回后清理所有内存),但标准是否还需要 - 或建议 - 在这种情况下使用delete [] ?如果没有,还有其他原因你会在这里删除[]吗?
我知道它们在语法上是如何不同的,并且C++使用new,而C使用malloc.但他们如何运作,在一个高级别的解释?
c++ ×9
new-operator ×5
malloc ×4
heap ×2
c ×1
c++11 ×1
padding ×1
performance ×1
pointers ×1
stack ×1