使用C ++中的new分配内存并重新解释指针

时间:2015-03-06 16:03:00

标签: c++ templates pointers memory

我想通过分配n * sizeof(T)字节为n个T对象分配内存,并使用new获取指针。以下代码有什么问题?

template <class T>
void foo(size_t n, const T& value)
{
    T* buffer = reinterpret_cast<T*>(new char[n * sizeof(T)]);
    for (int i = 0; i < n; i++) {
        buffer[i] = value;
        std::cout << buffer[i] << std::endl;
    }
    std::cout << "success" << std::endl;
}

如果我foo<int>(n, int());,但如果我拨打foo<std::string>(n, std::string());我会收到细分错误。

1 个答案:

答案 0 :(得分:4)

您需要在内存中创建一个对象,而不仅仅是将未初始化的字节重新解释为对象。对于int,你可以逃脱它,因为任务只会覆盖那里的任何东西。 std::string将(可能)包含无效的指针和大小,并且会认为这些引用了应该删除或替换为指定值的数据;因此崩溃。

要在预先分配的内存中创建对象,请使用placement-new而不是赋值:

new(&buffer[i]) T(value);

当你完成一个对象时,你必须在解除内存释放之前自己调用它的析构函数:

buffer[i].~T();

你可以使用std::vector<T> buffer(n, value);来避免这种容易出错的舞蹈,这种舞蹈会在幕后完成所有这些,而不会让你感到不安。