我必须使用新关键字吗?

do I HAVE to use the new keyword?

本文关键字:关键字      更新时间:2023-10-16

这不是我正在处理的代码,但这是我想做的要点。

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 参考,因此如果我弄错了,请告诉我。 我将通过它并完全重做我的代码。

有没有像矩阵这样的类型,可以让我保存不同类型的数据,这样我就不必发明一个新对象来单独处理每个对象?

如果您编写的内容是执行此操作的最有效和最快速的方法,那么我将创建一个新类来保存这两个项目。

谢谢:)