考虑以下代码
struct foo
{
const int txt_len;
const int num_len;
char * txt;
int * num;
foo(int tl, int nl): txt_len(tl), num_len(nl)
{
char * tmp = new char[txt_len * sizeof(char) + num_len * sizeof(int)];
txt = new (tmp) char [txt_len * sizeof(char)];
num = new (tmp + txt_len * sizeof(char)) int[num_len * sizeof(int)];
// is this the same as above?
// txt = tmp;
// num = (int *) (tmp + txt_len * sizeof(char));
}
~foo()
{
delete[] txt; // is this the right way to free the memory?
}
};
我希望 *txt
和 *num
是连续的,这是最好的方法吗?
placement new 和 pointer 算法之间有什么区别吗?我应该使用哪一个?
最佳答案
如果你想要一个连续的内存块,你必须通过调用 operator new[]
或 malloc()
或类似的方法来分配整个内存块。多次调用这些函数并不能保证分配 block 的任何连续性。您可以分配一个大块,然后根据需要从中雕刻零件。
而且你应该delete
和free()
所有以前用new
和malloc()
分配的 block ,否则你会泄漏内存并可能使你的程序不稳定(它会在某些时候无法分配更多内存)并对操作系统中的内存施加不必要的压力,可能会减慢其他程序或使它们变得不稳定。
然而,Placement new 实际上并没有分配任何内存。它只是在指定位置构造一个对象,因此您不需要两次释放该内存。
我在您的代码中看到的一个问题是它没有对齐整数。在某些平台上,从/向内存读取或写入大于 1 字节的整数必须对齐,如果不是,您可以从错误位置读取/写入值或获取导致程序终止的 CPU 异常。 x86 在这方面非常宽松,不会介意,但可能会因性能下降而加重您的负担。
关于c++ - 指向连续内存的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8767311/