1

这是我的代码:

int *arr1 = new int[size]();
int *arr2 = new int[size]();
int *arr3 = new int[size]();

我知道,我知道:std::unique_ptr如果我需要使用指针,我应该使用,但是分配要求我使用 * 数组(使用“动态分配”-我会使用std::vector,但由于某种原因也不允许这样做)。

我知道使用new是不好的做法,那么有没有办法使用指针数组而不使用该关键字或不必delete稍后再做?

4

6 回答 6

4

如果我们坚持“经典”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;
        }
 }
于 2013-08-31T15:16:35.607 回答
2

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';
}
于 2013-08-31T15:05:15.847 回答
1

new 关键字没有什么不好,它总是在动态空间分配的底部,即使你使用std::vector<>和朋友。std::unique_ptr等等也有他们的问题。但这不是,我的回答是关于什么。

我的回答是关于出于性能原因需要避免的情况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;
于 2013-08-31T15:32:34.537 回答
0

你可以只传递一个对一个巨大数字大小的静态数组的引用。

于 2013-08-31T15:30:46.967 回答
0

问题是是否size在编译时或仅在运行时已知(可以计算)。

如果第一种情况适用,请使用std::array,而后者则无法不使用new(间接)或传递给 STL 容器的某些分配器代理(例如std::vector)。

于 2013-08-31T15:09:28.387 回答
-1

任何声称使用 new 是不好的做法的人都不应被允许开发任何代码,因为如果我们扩大这种说服力,那么使用指针也是不好的,使用/开发 COM 对象也是不好的,使用堆也是不好的......在这种蛊惑人心的结局很可能是“使用计算机是不好的做法,让我们切换到石器时代吧”。

如果您不知道如何在不造成混乱的情况下使用 new/delete,请雇用会的人。

于 2013-08-31T16:38:46.750 回答