C++ 动态指针引用数组由三元运算符返回值,但有异常

C++ 动态指针引用数组由三元运算符返回值,但有异常,c++,C++,我正在学习指针、引用、返回值和三元运算符 我试图通过使用参数int*&a,为动态数组正确使用指向引用的指针,而不返回新创建的数组。我严格希望从主循环复制数组,并设置大小,如果分配失败,则抛出错误 这是正确的方法吗: int *_resize(int *&A, int s) { try { return A = new int[s] == (nullptr) ? throw std::bad_alloc() : A; } catch (...) { std::c

我正在学习指针、引用、返回值和三元运算符

我试图通过使用参数
int*&a
,为动态数组正确使用指向引用的指针,而不返回新创建的数组。我严格希望从主循环复制数组,并设置大小,如果分配失败,则抛出错误

这是正确的方法吗:

int
*_resize(int *&A, int s)
{
  try {
      return A = new int[s] == (nullptr) ? throw std::bad_alloc() : A;
  } catch (...) {
    std::cout << "H" << std::endl;
  }

}
int main()
{
  int *A;
  A = _resize (A, 1000000005546456456ul); // Test
}
为什么不简单呢

#include <iostream>
int *allocate(int s) noexcept
try { return new int[s]; } 
catch (...) { std::cout << "H" << std::endl; return nullptr; }

int main() {
    int *A = allocate (10000); 
    //(printing from utility functions and not using RAII
    //aren't exactly the C++ way)
}
#包括
int*分配(int s)无例外
尝试{返回新的int[s];}
catch(…){std::cout为什么不简单呢

#include <iostream>
int *allocate(int s) noexcept
try { return new int[s]; } 
catch (...) { std::cout << "H" << std::endl; return nullptr; }

int main() {
    int *A = allocate (10000); 
    //(printing from utility functions and not using RAII
    //aren't exactly the C++ way)
}
#包括
int*分配(int s)无例外
尝试{返回新的int[s];}
捕获(…){std::cout
没有什么意义。运算符优先级使得最左边的赋值最后执行。表达式的工作原理如下:

if (new int[s] == nullptr) {
  throw std::bad_alloc();
} else {
  A = A;
}
该函数从不修改
A
,它会立即泄漏分配的内存

没有什么意义。运算符优先级使得最左边的赋值最后执行。表达式的工作原理如下:

if (new int[s] == nullptr) {
  throw std::bad_alloc();
} else {
  A = A;
}


该函数从不修改
A
,它会立即泄漏分配的内存。

下面的解释确实帮助我理解了在使用三元运算符时发生的情况。感谢您的快速响应,我认为没有办法正确执行我的要求,或者这是一种不好的做法。坦率地说,我不明白什么是三元运算符这是你要问的,所以我发现很难建议正确的方法来做任何事情。我想做一个
int*A
指针。然后我将在
main()中将它设置为
nullptr
紧接着。我想通过一个参数将
A
与一个大小一起传递到一个函数中,如果成功分配了大小,则通过三元运算符返回它,如果没有抛出错误的话。我只是不想返回一个全新的
*A
动态数组。
A=new int[s]
会这样做。
new
在分配失败时抛出
bad\u alloc
。在相关说明中,
\u resize
声明返回
int*
,但实际上不包含任何
return
语句。到达非
void
函数的右括号显示未定义的行为。比较
 new int[s]==nullptr
应该是无意义的。它不会在出错时返回
nullptr
,而是抛出
std::bad_alloc()
,IIRC。下面的解释真的帮助我理解了在使用三元运算符时发生了什么。感谢您的快速响应,我认为没有办法正确地执行我的要求,或者这是一种不好的做法。坦率地说,我不明白您在问什么,所以我发现很难建议正确的执行方式不管怎样。我想做一个
int*A
指针。然后我将在
main()中将它设置为
nullptr
紧接着。我想通过一个参数将
A
与一个大小一起传递到一个函数中,如果成功分配了大小,则通过三元运算符返回它,如果没有抛出错误的话。我只是不想返回一个全新的
*A
动态数组。
A=new int[s]
会这样做。
new
在分配失败时抛出
bad\u alloc
。在相关说明中,
\u resize
声明返回
int*
,但实际上不包含任何
return
语句。到达非
void
函数的右括号显示未定义的行为。比较
 new int[s]==nullptr
应该是无意义的。它不会在出错时返回
nullptr
,而是抛出
std::bad_alloc()谢谢你的快速响应,我是新的语言。并且尝试用三元运算符来做类似于你的例子。@雷蒙德C++是一种巨大的语言,如果你违反规则,它是未定义的行为,这意味着任何事情都可能发生(包括文件被删除)。。尽可能保持事情的简单和干净符合您的最大利益。我理解您的意思,并感谢您的回复。我将把这标记为一个可接受的答案。如果您阅读我对Igor Tandetnik的评论,我可能会更深入地解释我的尝试。感谢您与我合作,这与我所看到的非常接近如果你想返回或抛出
std::bad_alloc()
你基本上就是在做新操作符所做的事情,所以:
int*allocate(ints){return new[s];}
。我之所以称之为allocate,是因为它不会调整任何大小。您编写的代码很有意义,正如您所说,它更简单。我将试验并查找您使用
noexcept
的情况,以及您如何使用
try
。同样在函数声明中,我不知道您被允许实现它。我将尝试并实现它谢谢你的快速响应,我是新的语言。我试着用三元运算符来做类似的例子。雷蒙德C++是一种巨大的语言,如果你违反规则,它是未定义的行为,这意味着任何事情都可能发生(包括文件被删除)。。尽可能保持事情的简单和干净符合您的最大利益。我理解您的意思,并感谢您的回复。我将把这标记为一个可接受的答案。如果您阅读我对Igor Tandetnik的评论,我可能会更深入地解释我的尝试。感谢您与我合作,这与我所看到的非常接近如果你想返回或抛出
std::bad_alloc()
你基本上就是在做新操作符所做的事情,所以:
int*allocate(ints){return new[s];}
,我称之为allocate