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

时间:2015-10-09 12:52:07

标签: c++

显然这不起作用,因为它被解释为分配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[]的单个对象,而不是使用int[10]来分配10个对象或数组的数组一个import UIKit import FBSDKCoreKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. //return true return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions) } func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) } 对象?

5 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:2)

分配一个对象数组。

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

这需要每个T的构造函数调用,以及当数组获得delete d时相应的析构函数调用,这就是数组需要new[]delete[]的原因,以及如果您尝试解决此问题,您的代码将被破坏。

所以:

int * ptr = new int[10];

// ...

delete [] ptr;

Boost it(因为裸指针很丑陋且容易出错):

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

// ...

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

std::array< int, 10 > a;

// ...

旧待机,<vector>

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

// ...

答案 2 :(得分:2)

Scene2D.UI运算符为一个类型的元素分配内存。这是它的工作方式。如果要分配多个元素的序列,则需要使用数组运算符并指定所需元素的编号new。如果您真的想要做类似的事情,您可以定义一个结构并在其上设置一个数组。所以在你调用new之后,这将自己分配数组。

new int[5]

答案 3 :(得分:2)

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 ]

答案 4 :(得分:2)

一种方法是在不完善的类型系统规则中运行 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[]来分配对象。第二个代码段显示了IMO使用new[]的最自然方式。 OP的new int[1][10]的建议是第二种方式(并且因此是获得指向数组的指针的第三种方式),并且具有在类型系统内工作的优点,但缺点是它不是很明显。

总之,答案

  

是否可以使用[非数组] new分配int[10]类型的单个对象

当然是。

1 该标准保证在POD struct开始时没有填充。在实践中,这意味着解除分配也没有问题。但是对于正式的,需要使用相同的类型进行重新分配和分配。