我必须使用新关键字吗?
do I HAVE to use the new keyword?
这不是我正在处理的代码,但这是我想做的要点。
object *objects; int totalObjects;
void addObject(object o)
{
objects[totalObjects] = o;
totalObjects++;
}
当我尝试这样做时,它给了我一个访问错误:
Unhandled exception at 0x00e8a214 in crow.exe: 0xC0000005: Access violation writing location 0xcccccccc
我是否必须使用"new",如果是这样,我是否必须创建一个新数组以每次复制到? 我可以只从我正在使用的数组中添加或获取元素吗?
你为什么不直接使用std::vector
?
std::vector<object> objects;
void addObject(object o)
{
objects.push_back(o);
}
..或
void addObject(const object &o)
{
objects.push_back(o);
}
以删除其他复制。
当涉及到在没有std::vector
的情况下实现自己的动态数组时,是的。 您需要分配新内存,并将阵列复制到新的内存块。这是我的示例代码,其中包含新的malloc
和放置。
#include <stdlib.h> // for malloc/free
#include <new> // for placement new, std::bad_alloc
object *objects = nullptr;
size_t totalObjects = 0;
void addObject(const object &o)
{
object *old_objects = objects;
size_t old_size = totalObjects;
size_t new_size = totalObjects + 1;
object *new_objects = (object *)malloc(sizeof(object) * new_size);
if (new_objects == nullptr)
throw std::bad_alloc();
size_t i;
try
{
for (i = 0; i < old_size; ++i)
{
new (&new_objects[i]) object(old_objects[i]); // placement new
}
}
catch (...)
{
// destroy new_objects if an exception occurs during creating new_objects
for (size_t j = 0; j < i; ++j)
{
new_objects[i].~object();
}
free(new_objects);
throw;
}
objects = new_objects;
free(old_objects);
}
(我还没有测试代码>o<)
请注意,我使用了malloc
和放置 new,而不是new
运算符。不可能用 array- new
调用动态数组每个元素的复制构造函数。
但是,如果您的object
是可复制的,则可以使用 realloc
。它可以更有效率,因为realloc
可以只扩展内存块,而无需复制 - 如果内存足够。
..您可以选择多行,只需在Visual Studio中按Tab(..或许多其他编辑器)。
您声明了一个object
指针,但尚未分配实际内存来存储object
对象。赋值语句只是尝试将输入对象o
复制到未分配的数组成员中。
这就是为什么您应该在分配之前使用new
的原因。new
运算符要求系统分配一些所需大小的内存,然后返回该内存的地址并将其分配给指针。然后,指针指向新分配的内存,可以进行分配(或复制)。
使用完阵列空间后,应使用 delete
释放分配的内存。
好的,我将为我自己的问题添加一个答案。 让我知道这是否是不礼貌的。 我只是想发布一些我自己的代码来与你的代码决斗。
#include <vector>
std::vector<object> objects;
好的,所以我想为对象使用两个数组(向量),并为距离提供双倍数组(矢量),这样我最终可能会得到
std::vector<double> distances;
void swap(unsigned int a, unsigned int b)
{
objects.swap_ranges(a,b);
distances.swap_ranges(a,b)
}
我正在使用此函数的 cplusplus.com 参考,因此如果我弄错了,请告诉我。 我将通过它并完全重做我的代码。
有没有像矩阵这样的类型,可以让我保存不同类型的数据,这样我就不必发明一个新对象来单独处理每个对象?
如果您编写的内容是执行此操作的最有效和最快速的方法,那么我将创建一个新类来保存这两个项目。
谢谢:)
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- C++函数的关键字?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- "friend"关键字在C++中是什么意思?
- 声明C++数组(带或不带 "new" 关键字)
- 对齐和对齐的实际用例C++关键字
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- 在 Objective-C++ -> EXC_BAD_ACCESS Error 中使用"new"关键字