如何动态分配单个int[10]对象

How to dynamically allocate a single int[10] object?

本文关键字:对象 int 动态分配 单个      更新时间:2023-10-16

显然这不起作用,因为它被解释为分配一个int数组:

int (*ptr)[10] = new int[10];

令人惊讶的是,这也不起作用:

typedef int arr10[10];
arr10 *ptr = new arr10;

ptr = new int[1][10];

,但它使用new[]而不是new

出于我自己的好奇心,是否有可能使用new来分配int[10]类型的单个对象,而不是使用new[]来分配一个包含10个对象的数组,或者一个包含int[10]对象的数组?

这不可能。c++中的数组没有一级对象语义,例如,它们不能传递给函数*或从函数返回。

可以在c++ 11中使用std::array。它有很多优点:对象语义,在调试模式下的索引检查,迭代器和STL接口,size()方法,没有隐式转换到指针。当您可以访问c++ 11编译器时,几乎没有理由再使用普通的旧C数组了。


*只能传递指向元素的指针或指向数组的指针/引用。

一种方法,在不完善的类型系统中工作1规则:

auto main() -> int
{
    using Ten_ints = int [10];
    Ten_ints* p_ints = []() -> Ten_ints*
    {
        struct Wrapper{ Ten_ints a; };
        return &(new Wrapper)->a;
    }();
    (void) p_ints;
}

一种更直接的方式,负责事情:

auto main() -> int
{
    using Ten_ints = int [10];
    Ten_ints* p_ints = reinterpret_cast<Ten_ints*>( new Ten_ints );
    (void) p_ints;
}

第一个代码片段执行OP要求的操作(在此回答的末尾引用),使用普通的new而不是new[]来分配对象。第二个代码片段显示了使用new[]的IMO最自然的方式。OP建议的new int[1][10]是第二种方法(因此是获得指向数组的指针的第三种方法),它具有在类型系统内工作的优点,但缺点是它不是很明显。

总结,

的答案

是否可以使用[non-array] new来分配int[10]类型的单个对象

当然是。


<一口>1标准保证在POD struct的开始处没有填充。实际上,这意味着重新分配也没有问题。但是对于正式的,需要使用与分配相同的类型来进行分配

new操作符为一个类型的一个元素分配内存。这就是它的运作方式。如果要分配一个以上元素的序列,则需要使用数组操作符并指定所需元素的编号new int[5]。如果你真的想做那样的事情,你可以定义一个struct并在它上面设置一个数组。之后当你调用new时,它会自己分配数组

typedef struct TEST{
    int testInt[5];
};
TEST* myVarTest = new TEST();

new int[10] 分配一个类型为int[10]的对象,即一个包含10个int的数组。但是,表达式的返回值是指向该数组第一个元素的指针。引用c++ 14,5.3.4/5:

当分配的对象是数组时(即,使用noptr-new-declarator语法new-type-id或)type-id表示数组类型),new-expression生成指向数组初始元素(如果有的话)的指针。[注: new intnew int[10]的类型都是int*,新int[i][10]的类型是int (*)[10] -end note]

正在分配一个对象数组。

T[10]是10个对象,而不是一个。实际上,它是十一个对象——一个数组(类型为array of 10 T),包含10个T对象。

这需要为每个T调用构造函数,并在数组获得 deleted时调用相应的析构函数,这就是为什么new[]delete[]对于数组是必需的,而如果你试图绕过它,你的代码将被破坏。

:

int * ptr = new int[10];
// ...
delete [] ptr;

或者Boost它(因为裸指针很难看而且容易出错):

boost::shared_array< int > ptr( new int[10] );
// ...

或者(因为不是每个人都喜欢Boost,标准为我们带来了<array>类:

std::array< int, 10 > a;
// ...

或者旧的备用<vector>:

std::vector< int > v( 10 );
// ...