当前位置: 首页 > 知识库问答 >
问题:

shared\u ptr包装动态数组时出现问题

诸葛雨泽
2023-03-14

我想用一个std::shared\u ptr替换类中的一些原始指针,这样在创建该类的副本时就不必担心了。但原始指针指向一个动态数组。当您为shared\u ptr提供一个自定义的deleter时,可以将其与动态数组一起使用。 g、 default\u删除

但当我尝试给那个字段分配一个新值时,我会得到一个很大的错误列表,即使是在构造时。

下面是一个最小的代码示例:

#include <memory>
#include <cstddef>

using namespace std;

template<typename T> shared_ptr<T[]> make_shared_array(size_t size)
{
  return shared_ptr<T[]>(new T[size], default_delete<T[]>());
}

struct Foo
{
  shared_ptr<char[]> field;
};

int main()
{
  Foo a;
  // This line produces the error.
  a.field = make_shared_array<char>(256);

  return 0;
}

NB:是的,我知道我可以/应该用向量代替动态数组。但他们的表现不一样。我做了一些繁重的图像处理,数组保存了像素。在低于VGA分辨率的情况下,处理时间从8增加到11 s、 那是相当多的。

更新:当然我可以在这里提供错误。我只是不知道我是否应该把问题描述和它混在一起。但这里是:

C: \程序文件(x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\memory(754):错误C2664:“标准::\u Ptr\u base


共有3个答案

韩烈
2023-03-14

如果指定了删除器,则在模板参数中不使用。只需将T[]更改为T

template <typename T> shared_ptr<T> make_shared_array(size_t size)
{
  return shared_ptr<T>(new T[size], default_delete<T[]>());
}

struct Foo
{
  shared_ptr<char> field;
};
微生令雪
2023-03-14

如果您坚持不应该使用std::向量,Boost有一个提升::shared_array,它可以作为智能指针来管理动态分配的对象数组。

shared_ptr不是为处理数组而设计的。既然shared_array可用,为什么要尝试在数组s上使用shared_ptr

仲柏
2023-03-14

您建议的解决方案是可行的,但您将失去阵列的大小:

#include <memory>
#include <cstddef>

using namespace std;

template<typename T> shared_ptr<T> make_shared_array(size_t size)
{
   return shared_ptr<T>(new T[size], default_delete<T[]>());
}

struct Foo
{
  shared_ptr<char> field;
};

int main()  
{
  Foo a;
  a.field = make_shared_array<char>(256);

 return 0;
}

我在这里所做的是让数组衰减为指针。只要删除器是数组删除器,它就应该表现正确。

为了防止大小丢失,如果您不能按照建议使用boost::shared\u array,我建议将此信息封装在您自己的shared\u array类中。

 类似资料:
  • 我一直在努力尝试,但我无法克服这个错误。我有Ruby版本1.8.7和Gem版本2.1.11,我试图安装open project,但我总是遇到这个错误 安装json(1.8.1)gem::installer::extensionbuilderror:错误:未能构建gem本机扩展。 迈克 安装json(1.8.1)时出错,Bundler无法继续。在绑定之前,请确保成功。==>出错:(==>安装中止。

  • 因此,即使成功地安装了pysqlcipher3,它也没有成功。 根据我的研究,这似乎是Windows用户试图安装Sqlcipher的常见问题。 尝试#1 首先,我尝试从github下载pysqlcipher3,并通过cmd手动构建和安装它(使用和)。 在执行Python3setup.py构建时,我有一些错误(缺少几个需求,没有OPENSSL_CONF环境变量等)。),但我修复了其中的大部分。 但是

  • 我试图在Windows上安装Antlr 4.4,目的是使用pyfuzzy,这是一个模糊逻辑的Python库,它依赖于Antlr的Python运行时来运行。我曾尝试(天真地)在不安装Antlr的情况下获得Python (2.7)的Antlr运行时,当然这并不成功。 因此,我尝试按照Windows的说明安装Antlr,但每次运行时都会出现错误: antlr .jar文件位于 C:\JavaLib 中,

  • 我试图安装名为“dbt”的软件包,但收到一条很长的错误消息。 我用谷歌搜索了这个问题,找到了一条线索。在这里,我试图过滤掉那些与我相关的答案,我在Windows上。我在最新版本中升级了pip。我试图安装“python开发工具”,但没有任何帮助。我觉得有点卡住了。有什么建议吗?我在下面添加错误消息以供参考 提前谢谢你! 错误消息: 错误:命令出错,退出状态为1:Command:'c:\users\4

  • gyp err!配置错误gyp错误!堆栈错误:eAcces:权限被拒绝,mkdir'/usr/local/lib/node_modules/hdf5/build'gyp err!系统达尔文17.7.0 gyp错误!命令“/usr/local/bin/node”“/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js

  • 本文向大家介绍解决python2.7用pip安装包时出现错误的问题,包括了解决python2.7用pip安装包时出现错误的问题的使用技巧和注意事项,需要的朋友参考一下 最近在使用pip安装包的的时候出现下面错误 查询资料后发现原因是pip安装python包会加载用户目录,用户目录恰好是中文的,ascii不能编码 打开对应的安装目录路径 D:\Python27\Lib\site-packages 新