我必须使用新关键字吗?

时间:2014-11-25 11:57:06

标签: c++

这不是我正在研究的代码,但它是我想要做的事情的要点。

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',如果需要,我是否必须创建一个新数组以便每次复制?我可以只添加或使用我正在使用的数组中的元素吗?

3 个答案:

答案 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调用动态数组的每个元素的复制构造函数是不可能的。

但是,如果您的objectTriviallyCopyable,则可以使用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参考此功能,请告诉我是否有错误。我将完成它并完全重做我的代码。

是否有类似矩阵的类型可以让我保存不同类型的数据,因此我不必发明一个新对象来单独处理每个数据?

如果您所写的内容是最有效,最快捷的方式,那么我会创建一个新课程来容纳这两个项目。

谢谢:)