- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在处理一些具有自定义分配和删除的内存空间,这些内存空间是使用类似 malloc 的接口(interface)创建的,不受我的控制(即不透明的 C 风格函数,用于“分配 n 个字节”或“释放一个字节”分配的指针”)。所以,没有什么比 new
或 delete
更好的了。
现在,我想构造一个 T
的数组。我通过 auto space_ptr = custom_alloc(n*sizeof(T))
获得了空间。现在我想做一些类似 array-placement-new 的事情来就地构造 n
元素。我该怎么做? ... 或者我应该从 1 循环到 n
并构建单个 T
?
注意:
alignof(T)
划分 sizeof(T)
)。如果您想解决对齐问题,那会更好,但为简单起见,您可以忽略它。最佳答案
我假设您的内存力与您的 T
完全一致。您可能想检查一下。
下一个问题是异常。我们真的应该写两个版本,一个有构造会导致异常的可能性,一个没有。
我将编写异常安全版本。
template<class T, class...Args>
T* construct_n_exception_safe( std::size_t n, void* here, Args&&...args ) {
auto ptr = [here](std::size_t i)->void*{
return static_cast<T*>(here)+i;
};
for( std::size_t i = 0; i < n; ++i ) {
try {
new(ptr(i)) T(args...);
} catch( ... ) {
try {
for (auto j = i; j > 0; --j) {
ptr(j-1)->~T();
}
} catch ( ... ) {
exit(-1);
}
throw;
}
}
return static_cast<T*>(here);
}
和不异常(exception)的安全版本:
template<class T, class...Args>
T* construct_n_not_exception_safe( std::size_t n, void* here, Args&&...args ) {
auto ptr = [here](std::size_t i)->void*{
return static_cast<T*>(here)+i;
};
for(std::size_t i = 0; i < n; ++i) {
new (ptr(i)) T(args...);
}
return static_cast<T*>(here);
}
你可以做一个基于标签分配的系统,根据是否从 Args&...
构造 T
抛出或不抛出,在它们之间进行选择。如果它抛出,并且 ->~T()
不平凡,请使用异常安全的。
C++17 公开了一些新函数来完成这些任务。他们可能会处理我不会处理的极端情况。
如果您尝试模拟 new[]
和 delete[]
,如果 T
有一个非平凡的 dtor,您将拥有在 block 中嵌入多少 T
。
执行此操作的典型方法是在 block 的前面 为计数请求额外的空间。即,要求 sizeof(T)*N+K
,其中 K
可能是 sizeof(std::size_t)
。
现在在您的 new[]
模拟器中,将 N
填充到第一位,然后在紧跟其后的 block 上调用 construct_n
。
在delete[]
中,传入的指针减去sizeof(std::size_t)
,读取N
,然后销毁对象(从右到左到镜像构建顺序)。
所有这些都需要小心try
-catch
。
但是,如果 ~T()
是微不足道的,那么您模拟的 new[]
和 delete[]
都不会存储额外的std::size_t
他们也不会阅读它。
(请注意,这是如何模拟 new[]
和delete[]
。new[]
和 delete[]
的工作取决于实现。我只是勾勒出一种你可以模拟它们的方法,它可能与它们在你的系统上的工作方式不兼容。例如,一些 ABI 可能始终存储 N
,即使 ->~T()
是微不足道的,或者有无数其他变体。)
正如 OP 所指出的,您可能还想在处理上述问题之前检查是否存在琐碎的构造。
关于c++ - 我应该如何将 placement new 与自定义分配 API 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40472875/
好的,所以我编辑了以下... 只需将以下内容放入我的 custom.css #rt-utility .rt-block {CODE HERE} 但是当我尝试改变... 与 #rt-sideslid
在表格 View 中,我有一个自定义单元格(在界面生成器中高度为 500)。在该单元格中,我有一个 Collection View ,我按 (10,10,10,10) 固定到边缘。但是在 tablev
对于我的无能,我很抱歉,但总的来说,我对 Cocoa、Swift 和面向对象编程还很陌生。我的主要来源是《Cocoa Programming for OS X》(第 5 版),以及 Apple 的充满
我正在使用 meta-tegra 为我的 NVIDIA Jetson Nano 构建自定义图像。我需要 PyTorch,但没有它的配方。我在设备上构建了 PyTorch,并将其打包到设备上的轮子中。现
在 jquery 中使用 $.POST 和 $.GET 时,有没有办法将自定义变量添加到 URL 并发送它们?我尝试了以下方法: $.ajax({type:"POST", url:"file.php?
Traefik 已经默认实现了很多中间件,可以满足大部分我们日常的需求,但是在实际工作中,用户仍然还是有自定义中间件的需求,为解决这个问题,官方推出了一个 Traefik Pilot[1] 的功
我想让我的 CustomTextInputLayout 将 Widget.MaterialComponents.TextInputLayout.OutlinedBox 作为默认样式,无需在 XML 中
我在 ~/.emacs 中有以下自定义函数: (defun xi-rgrep (term) (grep-compute-defaults) (interactive "sSearch Te
我有下表: 考虑到每个月的权重,我的目标是在 5 个月内分散 10,000 个单位。与 10,000 相邻的行是我最好的尝试(我在这上面花了几个小时)。黄色是我所追求的。 我试图用来计算的逻辑如下:计
我的表单中有一个字段,它是文件类型。当用户点击保存图标时,我想自然地将文件上传到服务器并将文件名保存在数据库中。我尝试通过回显文件名来测试它,但它似乎不起作用。另外,如何将文件名添加到数据库中?是在模
我有一个 python 脚本来发送电子邮件,它工作得很好,但问题是当我检查我的电子邮件收件箱时。 我希望该用户名是自定义用户名,而不是整个电子邮件地址。 最佳答案 发件人地址应该使用的格式是: You
我想减小 ggcorrplot 中标记的大小,并减少文本和绘图之间的空间。 library(ggcorrplot) data(mtcars) corr <- round(cor(mtcars), 1)
GTK+ noob 问题在这里: 是否可以自定义 GtkFileChooserButton 或 GtkFileChooserDialog 以删除“位置”部分(左侧)和顶部的“位置”输入框? 我实际上要
我正在尝试在主页上使用 ajax 在 magento 中使用 ajax 显示流行的产品列表,我可以为 5 或“N”个产品执行此操作,但我想要的是将分页工具栏与结果集一起添加. 这是我添加的以显示流行产
我正在尝试使用 PasswordResetForm 内置函数。 由于我想要自定义表单字段,因此我编写了自己的表单: class FpasswordForm(PasswordResetForm):
据我了解,新的 Angular 7 提供了拖放功能。我搜索了有关 DnD 的 Tree 组件,但没有找到与树相关的内容。 我在 Stackblitz 上找到的一个工作示例.对比drag'ndrop功能
我必须开发一个自定义选项卡控件并决定使用 WPF/XAML 创建它,因为我无论如何都打算学习它。完成后应该是这样的: 到目前为止,我取得了很好的进展,但还有两个问题: 只有第一个/最后一个标签项应该有
我要定制xtable用于导出到 LaTeX。我知道有些问题是关于 xtable在这里,但我找不到我要找的具体东西。 以下是我的表的外观示例: my.table <- data.frame(Specif
用ejs在这里显示日期 它给我结果 Tue Feb 02 2016 16:02:24 GMT+0530 (IST) 但是我需要表现为 19th January, 2016 如何在ejs中执行此操作?
我想问在 JavaFX 中使用自定义对象制作 ListView 的最佳方法,我想要一个每个项目如下所示的列表: 我搜了一下,发现大部分人都是用细胞工厂的方法来做的。有没有其他办法?例如使用客户 fxm
我是一名优秀的程序员,十分优秀!