如何动态分配单个int[10]对象
How to dynamically allocate a single int[10] object?
显然这不起作用,因为它被解释为分配一个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 int
和new int[10]
的类型都是int*
,新int[i][10]
的类型是int (*)[10]
-end note]
你正在分配一个对象数组。
T[10]
是10个对象,而不是一个。实际上,它是十一个对象——一个数组(类型为array of 10 T
),包含10个T
对象。
这需要为每个T
调用构造函数,并在数组获得 delete
d时调用相应的析构函数,这就是为什么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 );
// ...
- 在c++中访问int到类对象的映射时出错
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 包装一个对象并假装它是一个 int
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- 返回对象时从'const DList<int>* const'到 'DList<int>*' [-fallowive] 的转换无效
- 类对象在 int main() 中'undefined'
- 如果类对象需要在 C++ 中转换为 int,为什么会调用 "operator bool()"?
- 为什么 int 对象和函数类型之间不明确?
- switch 语句和对象隐式 int 转换
- 如何从 pair<int、对象的向量中删除重复项>
- 对类似"struct {double, int}"对象使用reinterpret_cast进行对象访问
- 重载 + 运算符以使用 int 添加对象
- 如何在C 2D向量中找到对象(而不是int)的位置
- 如何掩盖对象数组的数据类型字符串到C 中的INT
- jfieldid int对对象无效
- 在 c++ 中声明 int 对象
- 根据C++标准,int 变量是对象吗?
- 声明 Windows API 结构 (DCB) 的对象 - 错误 C4430:缺少类型说明符 - 假定为 int
- 如何使用 Android NDK 创建 Java 对象(int[])
- 拔河:将一组n个对象int划分为多个子集