有没有一种安全的方法可以迭代 std::unique_ptr<int[]>?
Is there a safe way to iterate over std::unique_ptr<int[]>?
在下面的代码中,我收到MSVC (C4996)的警告,指出std::copy(errors.begin(),errors.end(),pErrors.get());
不安全。它写入原始指针。有没有一种优雅而安全的方式来迭代元素?
主要目标是为调用遗留函数准备一个内置数组:
#include <iostream>
#include <initializer_list>
#include <memory>
#include <algorithm>
void print_errors_old_function(int argument_count,int* pErrors)
{
for (int i=0;i<argument_count;++i) { std::cerr << "Error" << pErrors[i] << " "; }
}
void print_errors(std::initializer_list<int> errors)
{
std::unique_ptr<int[]> pErrors{new int[errors.size()]};
std::copy(errors.begin(),errors.end(),pErrors.get()); // warning C4996
print_errors_old_function(errors.size(),pErrors.get());
}
int main()
{
print_errors({234,253,334});
return 0;
}
似乎基于范围的 for 循环对于std::unique_ptr<int[]>
是不可能的,并且常规的 for 循环的可读性可能不如 std::copy
.
你不需要std::unique_ptr
. std::vector
可以正常工作,因为&v[0]
保证为您提供指向内部缓冲区的指针,当然,它还具有可用于与 C 函数交互的size()
成员函数。从C++11开始,还有data()
,看起来比&v[0]
更好。
#include <iostream>
#include <initializer_list>
#include <vector>
void print_errors_old_function(int argument_count,int* pErrors)
{
for (int i=0;i<argument_count;++i) { std::cerr << "Error" << pErrors[i] << " "; }
}
void print_errors(std::initializer_list<int> errors)
{
std::vector<int> vErrors(errors);
print_errors_old_function(vErrors.size(), &vErrors[0] /* or vErrors.data() in C+11 */ );
}
int main()
{
print_errors({234,253,334});
return 0;
}
注意如何也摆脱警告。
另一个答案是正确的,但请注意,函数是这样的:
void print_errors_old_function(int argument_count,int* pErrors)
{
for (int i=0;i<argument_count;++i) { std::cerr << "Error" << pErrors[i] << " "; }
delete[] pErrors; // note this function effectively "consumes" the input
}
您将无法使用这种方法,因为无法释放vector
内存的所有权。你必须使用std::unique_ptr
你在问题中的方式,但你必须使用pErrors.release()
而不是pErrors.get()
。
视觉C++抱怨是因为在标准中定义的几个函数上,但它认为它们是"不安全的",这使得符合标准的代码不可编译。有时,Microsoft会提供仅在 Visual C++ 上可用的解决方法。
您可以执行的操作(选择以下选项之一):
- 利用建议Microsoft的解决方法
- 禁用 SDL 检查(这些检查会将这些警告转换为错误)
- 在项目中定义
_SCL_SECURE_NO_WARNINGS
。(禁用这些警告)
相关文章:
- 为什么 std::unique 不调用 std::sort?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 生成"unique"矩阵
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 我对 std::unique(算法)C++有问题
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++中的指针否定 (!ptr == NULL)
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误