c++ - 指向连续内存的指针

标签 c++ pointers memory-management

考虑以下代码

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 的任何连续性。您可以分配一个大块,然后根据需要从中雕刻零件。

而且你应该deletefree() 所有以前用newmalloc() 分配的 block ,否则你会泄漏内存并可能使你的程序不稳定(它会在某些时候无法分配更多内存)并对操作系统中的内存施加不必要的压力,可能会减慢其他程序或使它们变得不稳定。

然而,Placement new 实际上并没有分配任何内存。它只是在指定位置构造一个对象,因此您不需要两次释放该内存。

我在您的代码中看到的一个问题是它没有对齐整数。在某些平台上,从/向内存读取或写入大于 1 字节的整数必须对齐,如果不是,您可以从错误位置读取/写入值或获取导致程序终止的 CPU 异常。 x86 在这方面非常宽松,不会介意,但可能会因性能下降而加重您的负担。

关于c++ - 指向连续内存的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8767311/

相关文章:

garbage-collection - 我可以在性能监视器中使用哪个计数器来查看有多少内存正在等待 GC?

c++ - 没有数据库连接的字符串转义

python - OpenCV - 在捕获循环中没有 waitkey 不显示图像

.net - .NET 给了我什么,而 Win32 没有?

c++ - 什么是空指针,什么是空指针?

c++ - C++ 中的局部变量通常在什么时候分配内存?

c++ - 如何在元素填充过程中经济地存储稀疏矩阵?

c++ - 在C++中使用GSL最小化

c - 在 c 中使用箭头运算符运行 chdir 然后打印的段错误

c - C 中的数组和指针