簡體   English   中英

我必須使用new關鍵字嗎?

[英]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和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);
}

(我還沒有測試代碼> o <)

請注意,我使用了malloc和new 而不是 new運算符。 用array- new調用動態數組的每個元素的拷貝構造函數是不可能的。

但是,如果您的objectTriviallyCopyable ,則可以使用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參考資料獲取此功能,所以請告訴我是否有錯誤。 我將通過它並完全重做我的代碼。

是否有像矩陣這樣的類型可以讓我保存不同類型的數據,所以我不必發明一個新的對象來單獨處理每個對象?

如果您寫的是最有效,最快捷的方法,那么我將開設一個新類來容納這兩個項目。

謝謝 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM