[英]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
調用動態數組的每個元素的拷貝構造函數是不可能的。
但是,如果您的object
是TriviallyCopyable ,則可以使用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.