分配的内存和数组

你好所以我正在试验用预先分配的内存创建对象和数组。 例如,我有以下代码:

int * prealloc = (int*)malloc(sizeof(Test));

Test *arr = new(prealloc) Test();

测试定义如下:

class Test {
public:
    Test() {
        printf("In Constructorn");
    }
    ~Test() {
        printf("In Destructorn");
    }

    int val;
};

在这种情况下,如果我调用删除它实际上会释放内存不好,B / C也许我正在使用某种类型的内存管理器,所以这肯定会导致一些问题。 我在互联网上搜索,我发现的唯一解决方案是明确调用析构函数,然后调用free:

arr->~Test();
free(arr);

有没有另一种方法来做到这一点? 有没有办法调用delete并告诉它只调用析构函数而不释放内存?

我的第二个问题是使用数组时,像上一个例子,您可以传递给新的预分配内存:

int * prealloc2 = (int*)malloc(sizeof(Test) * 10);
Test *arr2 = new(prealloc2) Test[10];

如果我调用delete[]它不仅会调用数组中每个元素的析构函数,还会释放我不想要的内存。 我发现应该完成的唯一方法是通过数组并明确调用析构函数,然后自由调用。 与常规的无数组操作符一样,有没有办法告诉操作员在不释放内存的情况下调用析构函数?

我注意到的一件事是,数组的新运算符实际上会使用前4个字节来存储数组的大小(我只在32位版本的Visual Studio中测试过)。这将帮助我知道有多少元素数组有,但仍然有一个问题。 如果数组是一个指针数组呢? 例如:

Test **arr2 = new Test*[10];

请有人帮我解决这些问题。


这是正常的,并期望直接调用析构函数来销毁您使用placement new创建的对象。 至于任何其他的做事方式,唯一明显的选择是使用一个Allocator对象(至少99%的时间将只是一个新的包装器,直接调用析构函数)。

一般来说,你根本不想使用new[] 。 您通常希望为operator new (或可能是::operator new )分配原始内存,并使用匹配的operator delete::operator delete释放它。

您可以使用新的位置在该内存中创建对象,并通过直接调用析构函数来销毁它们。


除此之外,没有其他的方法可以做到这一点,因为删除也会试图释放内存。

在代码中使用预先分配的内存以及新的代码应该相当罕见 - 典型的用例是当你想要/需要在固定内存地址上映射对象时处理直接内存映射硬件接口 - 并且是某种东西我通常会考虑代码味道。

如果你想调整某个特定类的内存管理,那么使用带有自定义分配器的STL容器或者为该特定类重载运算符new和delete会更好。


是的,这是做到这一点的唯一方法。 被允许定义new但不delete是不对称的。 [那么,你可以做后者,但只能在new引发异常时调用(在下面没有正确处理!)

您可以使用模板化destroy来实现相同的结果:

class Test 
{
public:
    Test() {
        printf("In Constructorn");
    }
    ~Test() {
        printf("In Destructorn");
    }

    int val;
};

class Allocator
{
public:
    static void* allocate(size_t amount) { return std::malloc(amount);}
    static void unallocate(void* mem) { std::free(mem);}
    static Allocator allocator;
};

Allocator Allocator::allocator;

inline void* operator new(size_t size,  const Allocator& allocator)
{
    return allocator.allocate(size);
}


template<class T>
void destroy(const Allocator& allocator, T* object) 
{ 
    object->~T();
    allocator.unallocate(object);
}




int main()
{
    Test* t = new (Allocator::allocator) Test();

    destroy(Allocator::allocator, t);

    return 0;
}
链接地址: http://www.djcxy.com/p/73035.html

上一篇: allocated memory and arrays

下一篇: Class specific new/delete