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



我想通过分配 n * sizeof(T( 字节来为 n 个对象分配内存,并使用 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());我会得到分段错误。

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

要在预分配的内存中创建对象,请使用放置-new而不是分配:

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

一个对象后,在解除分配内存之前,必须自己调用其析构函数:

buffer[i].~T();

你可以避免这种容易出错的舞蹈,std::vector<T> buffer(n, value);它在幕后完成所有这些工作,而不会给你带来麻烦。

相关内容

最新更新