首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对数组指针应用新运算符的一种防错方法

对数组指针应用新运算符的一种防错方法
EN

Stack Overflow用户
提问于 2016-08-01 13:15:44
回答 4查看 171关注 0票数 4

在C语言中,我这样做

代码语言:javascript
复制
int (*ptr)[100];
ptr=malloc(sizeof *ptr); // this is the easy/error proof way of doing it

是否有对new运算符执行相同操作的防错C++方法

代码语言:javascript
复制
int (*ptr)[100];
ptr=new __what_comes_here?
EN

回答 4

Stack Overflow用户

发布于 2016-08-01 13:27:43

代码语言:javascript
复制
int (*ptr)[100];

表示ptr是一个指针,它应该保存一个包含100个整数的数组的地址。换句话说,从技术上讲,如果你有,就像这样:

代码语言:javascript
复制
int arr[100];  // automatic (compile time allocated) object of 100 integers

然后,您可能希望使用:

代码语言:javascript
复制
ptr = &arr;

但这里的情况并非如此。所以你可以使用一个简单的指针。如果你想实现动态化,那么你可以选择malloc的等价物:

代码语言:javascript
复制
int *p = new int[100];  // do `delete[] p` later to reclaim memory

注意,p是一个简单的指针,它保存动态分配的数组的第一个整数的地址。

但更好的做法是使用标准容器来避免任何内存管理:

代码语言:javascript
复制
std::vector<int> v(100);

如果大小为100是固定的,则可以使用:

代码语言:javascript
复制
int a[100];  // C-style

代码语言:javascript
复制
std::array<int, 100> arr;  // C++11 onwards

如果您需要new,并且没有使用上述功能,但仍然希望自动回收内存,那么可以使用unique_ptr作为following

代码语言:javascript
复制
std::unique_ptr<int[]> p(new int[100]);
票数 3
EN

Stack Overflow用户

发布于 2016-08-01 14:24:59

我在这里展示的方式显然不是一个很好的解决方案,我只是想以一种独特的方式回答这个问题。

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2016-08-01 14:25:59

代码语言:javascript
复制
typedef int IntArray[100];

int main()
{
    IntArray* p = new IntArray[1];

    delete[] p;
    return 0;
}

请注意,您必须使用delete[]解除分配由此分配的数组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38691438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档