分配内存并使用 new in C++重新解释指针
Allocating memory and reinterpreting pointer using 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);
它在幕后完成所有这些工作,而不会给你带来麻烦。
相关文章:
- 请解释"函数1(p1,p2,p3);"的输出
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 被解释为低级别const的const对象的地址
- 计算每个节点的树高,帮助我解释这个代码解决方案
- MSVC将仅移动结构参数解释为指针
- 内联程序集printf将整数解释为地址
- 有人能解释一下为什么下界是这样工作的吗C++的
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 有人能为我解释一下C++代码吗
- 你能解释一下什么运行时错误是如何解决它的吗?
- 请解释字谜的代码,我看不懂计数器数组,每个值已经是0
- 有人可以向我解释为什么控制台输出 0 吗?
- 有人可以解释一下这段代码如何能够反转字符串
- 在 C++ 中解释多维向量的语句时感到困惑
- 解释一下 for (char c : str) 的作用?
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 如何强制新操作员根据我的需要解释语句
- 关键字新C++的解释
- c++新语法,请解释一下