Jan*_*roň 32 c++ memory-management realloc
从什么是写在这里,new分配在自由存储,同时malloc采用堆和这两个术语往往意味着同样的事情.
根据此处的内容,realloc可以将内存块移动到新位置.如果免费存储和堆是两个不同的内存空间,它是否意味着任何问题呢?
具体来说,我想知道它是否安全使用
int* data = new int[3];
// ...
int* mydata = (int*)realloc(data,6*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
如果没有,是否还有其他方式可以安全地realloc分配内存new?我可以分配新的区域和memcpy内容,但据我所知,realloc如果可能的话可以使用相同的区域.
Che*_*Alf 47
您只能realloc通过malloc(或家庭等calloc)分配.
这是因为跟踪内存空闲和使用区域的底层数据结构可能完全不同.
它可能但不能保证C++ new和C malloc使用相同的底层分配器,在这种情况下realloc可以同时使用它们.但正式的是在UB-land.而在实践中,它只是不必要的风险.
C++不提供与之对应的功能realloc.
最接近的是容器的(内部缓冲区)的自动重新分配std::vector.
C++容器的设计方式不包括使用realloc.
而不是提出的代码
int* data = new int[3];
//...
int* mydata = (int*)realloc(data,6*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
… 做这个:
vector<int> data( 3 );
//...
data.resize( 6 );
Run Code Online (Sandbox Code Playgroud)
但是,如果你绝对需要一般的效率realloc,并且如果你必须接受new原始的分配,那么你唯一的追求效率就是使用特定于编译器的方法,realloc这种编译器是安全的.
否则,如果你绝对需要一般效率realloc而不是被迫接受new,那么你可以使用malloc和realloc.使用智能指针可以让您获得与C++容器相同的安全性.
小智 16
唯一的可能相关的限制C++增加realloc是C++的malloc/ calloc/ realloc不能在以下方面实现的::operator new,其free一定不能在以下方面来实现::operator delete(每C++ 14 [c.malloc] P3-4).
这意味着您正在寻找的保证在C++中不存在.这也意味着,但是,可以实现::operator new在以下方面malloc.如果你这样做,那么从理论上讲,::operator new结果可以传递给realloc.
在实践中,你应该关注new结果与结果不匹配::operator new的可能性.C++编译器可以例如组合多个new表达式以使用单个::operator new调用.这是编译器在标准不允许的情况下已经做过的事情,IIRC,标准现在允许它(根据C++ 14 [expr.new] p10).这意味着即使你走这条路,你仍然无法保证传递你的new指针realloc做任何有意义的事情,即使它不再是未定义的行为.
一般来说,不要这样做.如果您正在使用用户定义类型的不平凡的初始化,在再分配复制释放的情况下,你的对象的析构函数将不会被调用的realloc.复制时也不会调用复制构造函数.由于对象生存期的错误使用,这可能导致未定义的行为(请参阅C++标准§3.8对象生存期,[basic.life]).
1对象的生命周期是对象的运行时属性.如果一个对象属于类或聚合类型,并且它或其成员之一由除了普通默认构造函数之外的构造函数初始化,则称该对象具有非平凡的初始化.[注意:通过简单的复制/移动构造函数进行初始化是非平凡的初始化. - 尾注]
类型T对象的生命周期始于:
- 获得具有适当对齐和T型尺寸的存储,并且
- 如果对象具有非平凡的初始化,则其初始化完成.
类型T的对象的生命周期在以下情况下结束:
- 如果T是具有非平凡析构函数(12.4)的类类型,则析构函数调用开始,或者
- 重用或释放对象占用的存储空间.
后来(强调我的):
3本国际标准中归属于对象的属性仅适用于给定对象的生命周期.
所以,你真的不想在一生中使用一个对象.
一般来说,没有。
有很多事情必须坚持以确保安全:
平凡类型满足上述要求。
此外:
new[]功能全必须通过请求malloc没有任何变化,也不边上的任何记账。您可以通过替换全局 new[] 和 delete[] 或相应类中的那些来强制执行此操作。| 归档时间: |
|
| 查看次数: |
7514 次 |
| 最近记录: |