显然这不起作用,因为它被解释为分配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)
}
对象?
答案 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 int
和new 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
开始时没有填充。在实践中,这意味着解除分配也没有问题。但是对于正式的,需要使用相同的类型进行重新分配和分配。