私人运营商删除[重复]

2023-11-29

可能的重复:
公共运算符 new、私有运算符删除:使用 new 时出现 C2248“无法访问私有成员”

http://efesx.com/2009/12/01/public-operator-new-and-private-operator-delete/

在这篇文章中,我读到这段代码应该给出一个错误:

#include <cstdlib>

struct Try {
        Try () { /* o/ */ }

        void *operator new (size_t size) {
            return malloc(size);
        }

    private:
        void operator delete (void *obj) {
            free(obj);
        }
};

int main () {
    Try *t = new Try();

    return 0;
}

我用 gcc 4.7.1 尝试过:

Compilation finished with errors: source.cpp: In function 'int
main()': source.cpp:11:14: error: 'static void Try::operator
delete(void*)' is private source.cpp:17:22: error: within this context
source.cpp:11:14: error: 'static void Try::operator delete(void*)' is
private source.cpp:17:22: error: within this context source.cpp:17:10:
warning: unused variable 't' [-Wunused-variable]

在这篇文章的评论中我看到了这个链接 -公共运算符 new、私有运算符删除:使用 new 时出现 C2248“无法访问私有成员”

如果我理解正确,它就不会编译,因为编译器应该在通过调用适当的运算符删除从构造函数抛出异常的情况下避免任何内存泄漏。但为什么这段代码可以编译并运行呢?

#include <cstdlib>

struct Try {
        void *operator new (size_t size) {
            return malloc(size);
        }

    private:
        void operator delete (void *obj) {
            free(obj);
        }
};

int main () {
    Try *t = new Try;

    return 0;
}

按照标准它是否正确?

这段代码又如何呢?

#include <cstdlib>

struct Try {
        void *operator new (size_t size) {
            return malloc(size);
        }

    private:
        void operator delete (void *obj) {
            free(obj);
        }
};

int main () {
    Try *t = new Try();

    return 0;
}

它不能用 gcc 4.7.1 编译。

那么这样的事情应该如何在标准库中实现呢?

Comeau 并未编译所有这些示例:

"ComeauTest.c", line 15: error: function "Try::operator delete"
(declared at line 9) is inaccessible Try *t = new Try; ^

有人可以详细地向我解释一下吗?


  • 看来你对第一个例子的看法是正确的。

第二个和第三个示例涉及 POD 类型。还有那里初始化差异发挥作用。

  • 在第二个例子中,你的结构离开了未初始化的。没有出现问题。

  • 相反,在第三个示例结构中does初始化,所以你得到第一种情况。

Edit:

Then, operator new本身可以抛出异常。标准(c++11 darft 说):

If the new表达式通过抛出异常终止,它可能 通过调用释放函数释放存储(3.7.4.2)。如果 分配类型是非数组类型,分配函数的名称是operator new释放函数的名称是operator delete.

有点不清楚,作者想表达什么may释放存储。它似乎是实现定义的,如果它is释放。

无论如何,你可以尝试使用不抛出new版本:

void *operator new (size_t size, std::nothrow_t) throw() {
    return malloc(size);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

私人运营商删除[重复] 的相关文章

随机推荐

  • 亚马逊产品广告 API 签名问题

    我正在尝试使用亚马逊网络服务示例代码页面中发布的以下代码在亚马逊产品数据库中进行搜索 AWSECommerceService ecs new AWSECommerceService Create ItemSearch wrapper Ite
  • 为什么需要在索引中添加“0”才能访问数组值? [复制]

    这个问题在这里已经有答案了 我对这一行感到困惑 sum a s i 0 为了提供一些上下文 这是代码的其余部分 include
  • phpmyadmin 错误“#1062 - 键 1 的条目‘1’重复”

    我从数据库中删除了所有表 然后恢复 导入 备份 之后我得到error 1062 Duplicate entry 1 for key 1 我应该重复这个过程吗 或者是其他东西 为什么会出现这个错误 当您从 php admin 导出 sql 时
  • 适用于 Android ndk 的 libutils

    我需要使用中提供的一些类 Vector string8 libUtils so 但是这个库没有附带ndk linux x86 r4 此外 我在从源代码构建这个库时遇到一些问题 有人建过这个库或者知道在哪里下载吗 构建 Android 源代码
  • 如何在 Ruby on Rails 3 中使用 Phonegap

    我正在使用 ruby on Rails 3 制作一个移动网络应用程序 我怎样才能最好地使用phonegap 有什么建议么 该网络应用程序将以本机方式呈现给客户端 应用程序由谷歌地图 API v3 组成 除了带有谷歌地图的 V gt html
  • Phonegap存储本地数据库

    我的应用程序中有大量数据 我需要它 以防应用程序离线运行 目前我将它放在 data js 文件中并使用jQuery 数据功能来管理它 像这样的行有1800行 总共约 500kb data db Aarstra e 34236 1 34246
  • UIWebView 同时显示本地图像和 Facebook 评论

    我在 UIWebView 上遇到问题 我有一个显示 html 字符串的 WebView 该 html 字符串包含 网页文本 本地图片 脸书 评论 起初我只有 Html 本地图像 所以我使用了众所周知的方法 NSString path NSB
  • 有没有办法从 CXF 内的 JAX-RS REST 资源访问 CXF 消息交换?

    目前我们有一个使用 CXF 2 4 2 的 RESTful API 在我的一种资源方法中 我想处理一些查询参数并将结果存储在 CXF 消息交换中 以供输出拦截器稍后使用 我已经尝试注入 WebServiceContext 如前所述here
  • 如何在 React Bootstrap Table 中添加水平滚动条?

    我正在使用 React Bootstrap Table 我只想将水平滚动条添加到最后两列 最后两列应包装在可滚动容器中 我们如何实现这一点 const columns dataField id text Product ID dataFie
  • 查找表中每行的顶级父级 [SQL Server 2008]

    我有以下两张表 表人 Id Name 1 A 2 B 3 C 4 D 5 E 表关系层次结构 ParentId CHildId 2 1 3 2 4 3 这将形成一个树状结构 D C B A ParentId 和 ChildId 是 Pers
  • 有没有一种方便的方法可以在 Swing JTable 中使用微调器作为编辑器?

    我处理的数字数据通常会向上或向下编辑 0 01 Value of variable 因此与通常的文本单元格相比 微调器看起来是一个不错的选择 我看过 DefaultCellEditor 但它只接受文本字段 组合框或复选框 有没有方便的方法来
  • 两个已知的 Android 地理位置之间的角度

    我想找到两个已知地理位置之间的角度 基本上我想要的是 我想引导一个箭头 其尾点位于我当前的位置 箭头指向固定的地理位置 所以我在想 如果以某种方式 我能够在这两个地理位置之间获得一个角度 那么我可能也能做同样的事情 你们有什么建议可以更好地
  • Python 和 sqlite3 抛出错误:sqlite3.OperationalError:靠近“s”:语法错误

    我正在尝试使用 Python 和 BeautifulSoup 来抓取一些网络信息 迭代它 然后将一些片段插入 sqlite3 数据库中 但我不断出现这个错误 TBTscrape 中的文件 Users Chris Desktop BS4 TB
  • Azure:跨多个资源组共享资源

    是否可以在多个资源组之间共享特定资源 在我的例子中是 redis 缓存 资源组只是逻辑容器 资源位于哪个资源组中并不重要 您可以使用任何资源组中的资源 Example 假设您在 RG1 中创建应用服务计划 并在 RG2 中创建 Web 应用
  • Swift 3 中是否可以在不自动布局的情况下降低键盘的高度?

    我需要以编程方式降低键盘的高度 我有什么办法可以做到吗 我发现我们可以使用键盘扩展来降低高度 但我尝试过 但它对我不起作用 我有什么办法可以做到这一点吗 Edit But i can see small keyboards in some
  • 如何替换字符串的某些部分?

    如何用另一部分替换字符串的某一部分 输入字符串 Hello my name is Santa 我怎样才能改变一切a在我的字符串中还有其他东西吗 我想我需要一个foreach循环 但我不确定如何使用它 strtr str array a gt
  • java下载文件时如何检测网络断开?

    我正在使用以下代码使用 Java 下载文件 但我想检测连接何时丢失 我运行了以下代码 在下载过程中我故意断开了互联网连接 但没有引发异常并且挂起 即使打开连接后也没有任何反应 于是 它就永远挂了 没有任何例外 有没有办法让它在连接丢失时抛出
  • 我可以仅在底部椭圆化剪贴蒙版吗?

    我正在尝试在 CSS 中的图像上创建弯曲的剪贴蒙版 该曲线本质上只是一个非常宽的椭圆的下半部分 要求是角度 曲率不会根据图像的高度 宽度而改变 它应该始终保持一致 这是一个视觉效果 尝试1 边框半径 溢出隐藏 固定宽度 问题 图像高度影响曲
  • 为什么“cut”反对我的标签?

    我试图根据值所属的范围来标记值 就像你对作业评分一样 因此 如果我有一个平均测验分数的数据框和一个数值数据框 我将其用作为这些平均值分配分数的下限 grades lt read table text Student Mean Adam 94
  • 私人运营商删除[重复]

    这个问题在这里已经有答案了 可能的重复 公共运算符 new 私有运算符删除 使用 new 时出现 C2248 无法访问私有成员 http efesx com 2009 12 01 public operator new and privat