分配指针数组时不使用“new”
Allocate pointer array without using `new`?
这是我的代码:
int *arr1 = new int[size]();
int *arr2 = new int[size]();
int *arr3 = new int[size]();
我知道,我知道:如果我需要使用指针,我应该使用std::unique_ptr
,但赋值要求我使用*数组(使用"动态分配"-我会使用std::vector
,但出于某种原因,这也是不允许的)。
我知道使用new
是一种不好的做法,那么有没有一种方法可以使用指针数组而不使用该关键字,或者以后不必使用delete
?
如果我们坚持使用"classic"C++(而不是最新的出血边缘标准),那么就没有unique_ptr或std::array,使用new是正常的。它会带来一些存储泄漏(无法删除)或存储损坏(删除两次)的风险,但您的工作是编写代码以避免这些问题。
然而,有一些使用new的方法不太可能导致内存泄漏,如下所示。注意:这不是完全安全的生产代码,只是一个教程示例,介绍如何使用带析构函数的类来管理用new分配的存储的生存期。
class WithAnArray {
private:
int *storage;
public:
WithAnArray(unsigned size) {
storage = new int[size];
}
~WithAnArray() {
delete[] storage;
}
int* getArray() {
return storage;
}
}
C++11引入了std::array:-)这是一种回避问题的方法吗?:-):-)
描述为:
std::array是一个封装常量大小数组的容器。
使用示例:
std::array<int, 3> a2 = {1, 2, 3};
或者,您甚至可以使用std::unique_ptr,如本例所示:
int size = 10;
std::unique_ptr<int[]> fact(new int[size]);
for (int i = 0; i < size; ++i) {
fact[i] = (i == 0) ? 1 : i * fact[i-1];
}
for (int i = 0; i < size; ++i) {
std::cout << i << ": " << fact[i] << 'n';
}
新关键字没有什么不好的,它总是处于动态空间分配的底部,即使您使用std::vector<>
和friends也是如此。CCD_ 6等也有其问题。但事实并非如此,我的答案是关于这一点的。
我的答案是关于出于性能原因需要避免new
的情况(这是一个非常昂贵的运算符,需要几百个周期)。
您通常可以避免逐行分配数组,只需一次性分配所有数组,并手动构建所需的指针结构:
size_t fieldSize = width*height*sizeof(int);
size_t pointerArraySize = height*sizeof(int*);
char* memory = new char[fieldSize + pointerArraySize];
int** pointerArray = (int**)memory;
int* dataArray = (int*)&memory[pointerArraySize];
for(long i = height; i--; ) pointerArray[i] = &dataArray[i*width];
好吧,这比进行许多单独的分配要麻烦一些,但速度要快得多。而且,作为一个额外的好处,交易是一句话:
delete[] (char*)pointerArray;
问题是size
在编译时已知(可以计算)还是仅在运行时已知。
如果第一种情况适用,请使用std::array
,对于后者,不可能不使用new
(间接)或传递给STL容器的某个分配器代理(例如std::vector
)。
您可以直接传递对一个大小为巨大数字的静态数组的引用。
任何声称使用new是不好的做法的人都不应该被允许开发任何代码,因为如果我们扩大这种说服力,那么使用指针也是不好的,使用/开发COM对象也是不好,使用堆也是不好。。。在这种煽动的最后,很可能是"使用电脑是一种糟糕的做法,让我们切换到石器时代"。
如果你不知道如何在不造成混乱的情况下使用new/delete,那就雇佣一个知道的人。
- 在将 new 与指针一起使用时,创建数组的指定长度
- 在C++中,如果我可以直接将整数分配给指针而不使用"new",为什么要使用"new"?
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 删除使用 new 创建的 2D 或 3D 指针
- 基类指针:在哪里使用 new 和 delete
- 双指针在使用 new 时不调用对象构造函数
- 'new'和'='与指针的区别
- 哪些资源是由智能指针管理的,而它们的内存不是由new分配的
- (C++)如何在不导致 mem 泄漏的情况下将指针传递到分配了'new'的函数?
- C++:为什么可以在没有事先使用 new 的情况下在指向结构的指针上使用 delete?
- 为什么运算符"new"需要指针才能工作?
- 将指针返回使用New创建的数组数组
- "new"不会将内存分配给作为类的数据成员的指针
- 带"new"的指针和带"&variable"的指针有什么区别
- 基于索引的 alloca 返回的指针访问和"placement new"的效果
- 将内存分配给 2D 数组时,“new int*[rowCount];”的含义是什么?是 2D 数组,是指向数组的指针数组
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 使用 malloc 而不是 new 会导致 free():指针错误无效
- 如何将一系列指针分配给Usinig New
- 如何将`new`用于数组的指针