在C语言中,我这样做
int (*ptr)[100];
ptr=malloc(sizeof *ptr); // this is the easy/error proof way of doing it是否有对new运算符执行相同操作的防错C++方法
int (*ptr)[100];
ptr=new __what_comes_here?发布于 2016-08-01 13:27:43
int (*ptr)[100];表示ptr是一个指针,它应该保存一个包含100个整数的数组的地址。换句话说,从技术上讲,如果你有,就像这样:
int arr[100]; // automatic (compile time allocated) object of 100 integers然后,您可能希望使用:
ptr = &arr;但这里的情况并非如此。所以你可以使用一个简单的指针。如果你想实现动态化,那么你可以选择malloc的等价物:
int *p = new int[100]; // do `delete[] p` later to reclaim memory注意,p是一个简单的指针,它保存动态分配的数组的第一个整数的地址。
但更好的做法是使用标准容器来避免任何内存管理:
std::vector<int> v(100);如果大小为100是固定的,则可以使用:
int a[100]; // C-style或
std::array<int, 100> arr; // C++11 onwards如果您需要new,并且没有使用上述功能,但仍然希望自动回收内存,那么可以使用unique_ptr作为following
std::unique_ptr<int[]> p(new int[100]);发布于 2016-08-01 14:24:59
我在这里展示的方式显然不是一个很好的解决方案,我只是想以一种独特的方式回答这个问题。
template<typename>
struct deref;
template<typename T>
struct deref<T*>
{
typedef T type;
};
int main() {
int (*ptr)[100];
ptr = new deref<decltype(ptr)>::type[1];
return 0;
}我知道[1]显然是高度可疑的,但如果没有它,new的结果似乎只会衰败为int*。因此,我认为添加它只会导致“外部”数组衰减,而内部则完好无损。
这也意味着你需要调用delete[]来清理它,并且不会导致未定义的行为。
如果你想说服自己,这实际上分配了必要的空间,它可以正确地访问它,你可以看看the output of godbolt in an example。
发布于 2016-08-01 14:25:59
typedef int IntArray[100];
int main()
{
IntArray* p = new IntArray[1];
delete[] p;
return 0;
}请注意,您必须使用delete[]解除分配由此分配的数组。
https://stackoverflow.com/questions/38691438
复制相似问题