这不是我正在研究的代码,但它是我想要做的事情的要点。
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',如果需要,我是否必须创建一个新数组以便每次复制?我可以只添加或使用我正在使用的数组中的元素吗?
答案 0 :(得分:3)
为什么不使用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
和placement new。
#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);
}
(我还没有测试过代码&gt; o&lt;)
请注意,我使用了malloc
和展示位置新的不是 new
运算符。用数组 - new
调用动态数组的每个元素的复制构造函数是不可能的。
但是,如果您的object
为TriviallyCopyable,则可以使用realloc
。它可以更高效,因为realloc
可以扩展内存块而不需要复制 - 如果内存足够的话。
..您可以选择多行,只需在Visual Studio中按 TAB (或许多其他编辑器)。
答案 1 :(得分:2)
您声明了一个object
指针,但尚未分配实际内存来存储object
个对象。您的赋值语句只是尝试将输入对象o
复制到未分配的数组成员中。
这就是你应该在作业之前使用new
的原因。 new
运算符要求系统以所需大小分配一些内存,然后返回该内存的地址并将其分配给指针。然后,指针指向新分配的内存,并且可以进行分配(或复制)。
使用完阵列空间后,应使用delete
释放分配的内存。
答案 2 :(得分:0)
好的,我要为自己的问题添加一个答案。如果这是一个糟糕的礼仪,让我知道。我只想发布一些我自己的代码与你的决斗。
#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参考此功能,请告诉我是否有错误。我将完成它并完全重做我的代码。
是否有类似矩阵的类型可以让我保存不同类型的数据,因此我不必发明一个新对象来单独处理每个数据?
如果您所写的内容是最有效,最快捷的方式,那么我会创建一个新课程来容纳这两个项目。
谢谢:)