Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我可以通过引用调用placement new和析构函数吗?

我可以通过引用调用placement new和析构函数吗?
EN

Stack Overflow用户
提问于 2017-12-25 20:01:55
回答 3查看 129关注 0票数 2

我是否可以传递对未初始化内存的引用,获取地址,然后调用pass new或在获得的内存位置上调用析构函数。换句话说,下面的程序是合法的行为还是有未定义的行为:

代码语言:javascript
运行
AI代码解释
复制
#include <string>
#include <iostream>

void ctor (std::string &s)
{
  new (&s) std::string ("Hello, world!");
}

void dtor (std::string &s)
{
  (&s)->std::string::~string ();
}

int main ()
{
  std::string * memory = static_cast<std::string *> (
    operator new (sizeof (std::string) * 10));

  ctor (memory [0]);

  std::cout << memory [0] << '\n';

  dtor (memory [0]);

  operator delete (memory);
}

当然,它是有效的,并且我尝试了gcc的未定义行为消毒器,它没有产生任何错误。但有没有人能根据这个标准来证实/反驳呢?

EN

回答 3

Stack Overflow用户

发布于 2017-12-25 20:07:12

上面的代码在[0]双重构造一个字符串,这是一个潜在的资源泄漏,然后双重销毁它,这是未定义的行为。

new string[10]在数组中构造对象。delete[]将销毁这些对象。您在另一个对象之上创建一个新对象,然后销毁它,然后在delete[]时再次销毁它。

其他的看起来都没问题;我的意思是它使用了原始分配,这通常是不好的做法,代码是异常的不安全的,等等。

票数 1
EN

Stack Overflow用户

发布于 2017-12-25 20:07:38

代码语言:javascript
运行
AI代码解释
复制
dtor (memory [0]);

delete [] memory;

绝对是未定义的行为。

在行中构造的对象的生存期

代码语言:javascript
运行
AI代码解释
复制
std::string * memory = new std::string [10];

在使用placement new运算符时结束。

因此,

代码语言:javascript
运行
AI代码解释
复制
delete [] memory;

是未定义的行为。

更新

更新后的代码行

代码语言:javascript
运行
AI代码解释
复制
dtor (memory [0]);

operator delete (reinterpret_cast<void *> (memory));

举止得体。

使用放置新操作符分配的对象的析构函数只被调用一次。

operator delete调用将释放由operator new调用分配的内存。

票数 1
EN

Stack Overflow用户

发布于 2017-12-25 23:36:58

编辑后,似乎不再有未定义的行为。

但是,您的代码中仍然存在危险

您的memory变量具有指向构造字符串的指针的类型,即使在初始化指针后该指针后面没有字符串。指针也不是nullptr。这很危险。你是在向编译器断言某些东西是正确构造的对象,而事实并非如此,因此,编译器不会在错误地使用未构造的对象时抓到你。

我强烈建议使用char*变量跟踪未初始化的内存,并且只对已经正确构造的对象使用类类型指针。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47971664

复制
相关文章
VsDoc for jQuery
Microsoft 现在完全支持 jQuery 并将它集成在ASP.NET MVC 框架。jQuery-vsdoc.js文件,该文件对串连的jQuery selector方法的JavaScript intellisense提供了帮助注释和支持。 此外,扩展已完全集成 jQuery Visual Studio 2008 SP 1 中的 IntelliSense。2009年2月24日Visual Web Developer Team宣告了1.3*-vsdoc的官方版本! 現在大家可以直接由jQuery官方网站的
张善友
2018/01/30
8600
鼠标点击层以外的地方层隐藏
根据去哪儿(http://www.qunar.com/)输入框点击按钮而写 实现功能效果: 1、点击按钮,相应层显示,点击层以外的部分层隐藏; 2、重复点击按钮时,按钮附属层显示时变隐藏,反之亦然; 3、如果一个页面上有两个以上这种效果,层会有互斥效果; <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default5.aspx.cs" Inherits="Default5" %> <!DOCTYPE html PUBLIC "-//W3C/
Porschev
2018/01/16
1.4K0
HTML5(九)——超强的 SVG 动画
SVG 动画有很多种实现方法,也有很大SVG动画库,现在我们就来介绍 svg动画实现方法都有哪些?
呆呆
2021/11/30
2.5K0
程序员Web面试之jQuery
又到了一年一度的毕业季了,青春散场,却等待下一场开幕。 在求职大军中,IT行业的程序员、码农是工科类大学生的热门选择之一, 尤其是近几年Web的如火如荼,更是吸引了成千上万的程序员投身其中追求自己的梦
葡萄城控件
2018/01/10
2.6K0
程序员Web面试之jQuery
和弦推导逻辑简析与实现,以及Raphael库试用
根据文章内容,总结为:本文主要介绍了如何利用Raphael.js库绘制吉他弦的交互式图形,通过定义ChordShape和ScaleShape两个模块,完成了从和弦定义到图形生成的整个过程。同时,作者还提供了在浏览器中绘制吉他弦的代码示例,以及一个基于Node.js的服务器端渲染示例。
IMWeb前端团队
2017/12/29
1.6K0
和弦推导逻辑简析与实现,以及Raphael库试用
HTML5(九)——超强的 SVG 动画
SVG 动画有很多种实现方法,也有很大SVG动画库,现在我们就来介绍 svg动画实现方法都有哪些?
呆呆
2021/09/30
3.3K0
HTML5(九)——超强的 SVG 动画
SVG 动画有很多种实现方法,也有很大SVG动画库,现在我们就来介绍 svg动画实现方法都有哪些?
呆呆
2021/10/01
3.7K0
和弦推导逻辑简析与实现,以及Raphael库试用
诚然,吉他有上千个和弦。世界上最厉害的吉他大师,也无法一眼辨识出所有的和弦。 更多时候,我们熟记几个基本的和弦,然后通过一定的计算法则,去推导其他的和弦。因而推导的逻辑就非常重要。
IMWeb前端团队
2019/12/03
7480
和弦推导逻辑简析与实现,以及Raphael库试用
Wijmo 更优美的jQuery UI部件集:在安全站点使用Wijmo控件
通常我们总会遇到这样的问题,在安全站点(HTTPS)中使用C1Wijmo控件时,用户可能会收到脚本错误。 发生这种状况的是由于我们的CDN链接不是https链接。 解决HTTPS 的错误 为了解决上述
葡萄城控件
2018/01/10
7450
Wijmo 更优美的jQuery UI部件集:在安全站点使用Wijmo控件
Asp.Net开发等级星使用(Jquery Rating)
插件参数: rater第一个参数是AJAX提交的URL rater第二个参数 maxvalue:最大星数 curvalue:默认选择多少颗星 title:鼠标放在星上的提示 enable:可设置true or false,控件是否可用 rater的第三个参数回调函数 aspx页代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"%> <!DOCTYPE html P
Porschev
2018/01/16
7710
Asp.Net开发等级星使用(Jquery Rating)
DjangoBlog|12 博客文章删除功能(优化版)
大家好,我是老表,这个系列将会更新我编写,项目的学习笔记,也是后面更新的一个重点,希望个人博客页面可以早点和大家见面~欢迎大家点赞、留言支持。
老表
2021/12/27
7910
DjangoBlog|12 博客文章删除功能(优化版)
前台JS(Jquery)调用后台方法 无刷新级联菜单示例
前台用AJAX直接调用后台方法,老有人发帖提问,没事做个示例 CasMenu.aspx页面: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="CasMenu.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio
Porschev
2018/01/16
4.4K0
Using ASP.NET and jQuery to Pass Multiple Values from a GridView to Another Page
Using ASP.NET and jQuery to Pass Multiple Values from a GridView to Another Page In one of our previous article Pass Multiple Values from a GridView to Another Page using ASP.NET, we had seen how to select a GridView row and pass multiple values of the se
阿新
2018/04/12
1K0
Jquery 事件冒泡
什么是JS事件冒泡?: 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。 (摘自网络) 如何来阻止Jquery事件冒泡? 通过一个小例子来解释 <%@ Page Language="C#" AutoEventW
Porschev
2018/01/16
2.9K0
Asp.net利用JQuery弹出层加载数据
最近看QQ空间里面的投票功能很使用。点击一个链接就弹出一个层,然后再加载一些投票信息,旁边的区域变成灰色不可用状态。其实这不算什么高深的技术,只要在ASP.NET中利用JQuery结合一般处理程序ASHX即可搞定了。
SAP梦心
2022/05/10
2.8K0
Asp.net利用JQuery弹出层加载数据
Wijmo 更优美的jQuery UI部件集:复合图表(CompositeChart)
Wijmo的CompositeChart控件允许您使用一个Chart来分析和展现复杂的数据。相同的数据可以使用不同的可视化效果,不同的图表类型展现在一个图表内,使得用户可以从不同的角度,了解分析这组数
葡萄城控件
2018/01/10
1.2K0
Wijmo 更优美的jQuery UI部件集:复合图表(CompositeChart)
用于 Windows8 的 Wijmo Charts 图表控件
随着Windows 8 Developer Preview 和 Visual Studio 11 Preview的发布, 大家对Metro-style的关注也逐步升温。最大的改变就是我们可以用HTML、JavaScript以及CSS进行Windows 应用程序的开发了。这应该是所有的Web Developer的福利了。 众所周知,Wijmo 是一套JavaScript UI 类库。我打算试着把它放到Windows 8里,准确的说,我尝试利用Wijmo的Charts实现一个Windows 8下的Metro U
葡萄城控件
2018/01/10
2.8K0
用于 Windows8 的 Wijmo Charts 图表控件
常用js,css文件统一加载方法,并在加载之后调用回调函数
为了方便资源管理和提升工作效率,常用的js和css文件的加载应该放在一个统一文件里面完成,也方便后续的资源维护。所以我用js写了以下方法,存放在“sourceController.js”文件内。 /** * Created by MingChen on 2016/11/3. */ function sourceController() { this.root = ""; this.callfunc = null; // 回调函数 this.css = []; thi
就只是小茗
2018/03/07
3.6K0
使用Raphael绘制流程图,自绘动态箭头,可拖动,有双击事件,纯前端,兼容各种浏览器
官方宣称兼容各种主流浏览器,据笔者测试在IE6下尚有一些问题(不过这些与本文无关)
liulun
2022/05/09
1K0
使用Raphael绘制流程图,自绘动态箭头,可拖动,有双击事件,纯前端,兼容各种浏览器
.NET魔法堂:工程构建基石->MSBuild
一、前言                               MSBuild是一个既熟悉又陌生的名字,Visual Studio的项目加载和构建均通过MSBuild来实现。VS中右键打开项目菜
^_^肥仔John
2018/01/18
2K0
.NET魔法堂:工程构建基石->MSBuild

相似问题

Wordpress图像未正确裁剪

40

本地WordPress安装不会裁剪图像

10

Wordpress 3.3.1没有裁剪功能图像

20

禁用响应图像大小裁剪

10

Wordpress切割图像大小

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文