- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<分区>
我写了下面的想法,认为它应该在运行时出现段错误。然而它没有,它运行良好,我不明白为什么。
#include <cstdlib>
#include <cstdio>
#include <new>
struct MyStruct
{
double *a;
MyStruct()
: a(NULL)
{ printf("Default constructor\n"); }
MyStruct( double *b )
: a(b)
{}
MyStruct( const MyStruct& other )
{
printf("Copy-constructor\n");
if ( a != NULL && *a != 3.14 )
a = other.a;
}
};
int main()
{
double num = 3.14;
MyStruct obj( &num );
void *ptr = ::operator new( sizeof(MyStruct) );
new (ptr) MyStruct(obj);
delete (MyStruct*) ptr; // Calls ~MyStruct
}
输出是:
Copy-constructor
当我写 void *ptr =::operator new( sizeof(MyStruct) );
我知道这只分配内存,不应该调用默认构造函数。它似乎并没有:很好。
当我编写 new (ptr) MyStruct(obj);
时,如果它像我想象的那样工作,我希望它会出现段错误。我认为这等同于 ( (MyStruct*) ptr )->MyStruct(obj)
。如果是这样,行 if ( a != NULL && *a != 3.14 )
应该到达 *a != 3.14
和段错误,因为 a
尚未初始化。
我的问题是 a
似乎没有被初始化(因为没有输出“Default constructor”),但是之前的仍然没有段错误。我错过了什么?
下面是生成的汇编代码(不知道怎么读):
.file "placement_new.cpp"
.section .rodata.cst8,"aM",@progbits,8
.align 8
.LCPI0_0:
.quad 4614253070214989087 # double 3.1400000000000001
.text
.globl main
.align 16, 0x90
.type main,@function
main: # @main
.cfi_startproc
# BB#0:
push rbp
.Ltmp2:
.cfi_def_cfa_offset 16
.Ltmp3:
.cfi_offset rbp, -16
mov rbp, rsp
.Ltmp4:
.cfi_def_cfa_register rbp
sub rsp, 48
lea rdi, qword ptr [rbp - 24]
lea rsi, qword ptr [rbp - 16]
movsd xmm0, qword ptr [.LCPI0_0]
mov dword ptr [rbp - 4], 0
movsd qword ptr [rbp - 16], xmm0
call _ZN8MyStructC2EPd
movabs rdi, 8
call _Znwm
mov qword ptr [rbp - 32], rax
mov rax, qword ptr [rbp - 32]
cmp rax, 0
mov qword ptr [rbp - 40], rax # 8-byte Spill
je .LBB0_2
# BB#1:
lea rsi, qword ptr [rbp - 24]
mov rax, qword ptr [rbp - 40] # 8-byte Reload
mov rdi, rax
call _ZN8MyStructC2ERKS_
.LBB0_2:
mov rax, qword ptr [rbp - 32]
cmp rax, 0
mov qword ptr [rbp - 48], rax # 8-byte Spill
je .LBB0_4
# BB#3:
mov rax, qword ptr [rbp - 48] # 8-byte Reload
mov rdi, rax
call _ZdlPv
.LBB0_4:
mov eax, dword ptr [rbp - 4]
add rsp, 48
pop rbp
ret
.Ltmp5:
.size main, .Ltmp5-main
.cfi_endproc
.section .text._ZN8MyStructC2EPd,"axG",@progbits,_ZN8MyStructC2EPd,comdat
.weak _ZN8MyStructC2EPd
.align 16, 0x90
.type _ZN8MyStructC2EPd,@function
_ZN8MyStructC2EPd: # @_ZN8MyStructC2EPd
.cfi_startproc
# BB#0:
push rbp
.Ltmp8:
.cfi_def_cfa_offset 16
.Ltmp9:
.cfi_offset rbp, -16
mov rbp, rsp
.Ltmp10:
.cfi_def_cfa_register rbp
mov qword ptr [rbp - 8], rdi
mov qword ptr [rbp - 16], rsi
mov rsi, qword ptr [rbp - 8]
mov rdi, qword ptr [rbp - 16]
mov qword ptr [rsi], rdi
pop rbp
ret
.Ltmp11:
.size _ZN8MyStructC2EPd, .Ltmp11-_ZN8MyStructC2EPd
.cfi_endproc
.section .rodata.cst8,"aM",@progbits,8
.align 8
.LCPI2_0:
.quad 4614253070214989087 # double 3.1400000000000001
.section .text._ZN8MyStructC2ERKS_,"axG",@progbits,_ZN8MyStructC2ERKS_,comdat
.weak _ZN8MyStructC2ERKS_
.align 16, 0x90
.type _ZN8MyStructC2ERKS_,@function
_ZN8MyStructC2ERKS_: # @_ZN8MyStructC2ERKS_
.cfi_startproc
# BB#0:
push rbp
.Ltmp14:
.cfi_def_cfa_offset 16
.Ltmp15:
.cfi_offset rbp, -16
mov rbp, rsp
.Ltmp16:
.cfi_def_cfa_register rbp
sub rsp, 32
lea rax, qword ptr [.L.str]
mov qword ptr [rbp - 8], rdi
mov qword ptr [rbp - 16], rsi
mov rsi, qword ptr [rbp - 8]
mov rdi, rax
mov al, 0
mov qword ptr [rbp - 24], rsi # 8-byte Spill
call printf
mov rsi, qword ptr [rbp - 24] # 8-byte Reload
cmp qword ptr [rsi], 0
mov dword ptr [rbp - 28], eax # 4-byte Spill
je .LBB2_3
# BB#1:
movsd xmm0, qword ptr [.LCPI2_0]
mov rax, qword ptr [rbp - 24] # 8-byte Reload
mov rcx, qword ptr [rax]
movsd xmm1, qword ptr [rcx]
ucomisd xmm1, xmm0
jne .LBB2_2
jp .LBB2_2
jmp .LBB2_3
.LBB2_2:
mov rax, qword ptr [rbp - 16]
mov rax, qword ptr [rax]
mov rcx, qword ptr [rbp - 24] # 8-byte Reload
mov qword ptr [rcx], rax
.LBB2_3:
add rsp, 32
pop rbp
ret
.Ltmp17:
.size _ZN8MyStructC2ERKS_, .Ltmp17-_ZN8MyStructC2ERKS_
.cfi_endproc
.type .L.str,@object # @.str
.section .rodata.str1.1,"aMS",@progbits,1
.L.str:
.asciz "Copy-constructor\n"
.size .L.str, 18
.ident "Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)"
.section ".note.GNU-stack","",@progbits
我看过一些 placement new 的例子,但对各种类型内部发生的事情有点困惑。 一个简单的例子: using my_type = std::string; using buffer_
需要帮助在 Hibernate 继承中实现此场景 Cow 和 Dog 继承 Animal 类, 牛和狗都有“后代”名单 牛有额外的 list - 每月疫苗接种日期 这个 Hibernate 表示方式正
背景 我正在开发一个嵌入式 C++ 项目,在该项目中我正在使用继承构建一个简单的状态机。这个想法是每个状态都将继承自一个名为 State 的基类,状态管理器将在状态转换期间创建和销毁子类实例。为了避免
这里有没有人使用过C++的“placement new”?如果是这样,那是为了什么?在我看来,它仅在内存映射的硬件上有用。 最佳答案 新的Placement允许您在已分配的内存中构造一个对象。 当您需
我一直在阅读一些关于 placement new on SO 的问题,我发现了一些不同的使用方法,我想我会在这里问一下。我知道 placement new 基本上是您创建对象并在您选择的已分配内存中为
我正在通过以下代码学习新的 C++ 布局。 class Cell { public: Cell() { printf("default constructor by %s\n"
#include #include struct A { int a; }; struct B : virtual A { int b; }; struct C : virtual A { in
我刚刚发现了一些用 C++ 实现的容器。该类使用内部缓冲区来管理其对象。这是一个没有安全检查的简化版本: template class Container { public: Containe
是否有一种模式可以在退出范围时自动调用堆栈上 placement-new 初始化对象的析构函数?我想跳过内存显式调用析构函数的需要。或者,是否有一种不同于 placement-new 的方法来构建具有
在 Android Activity 上,我想将图像设置为左下角的背景。操作方法如下:Background Image Placement 但是,我还希望能够指定不是该图像的其余背景具有特定颜色。这可
这里有人用过C++的“placement new”吗?如果是这样,为什么?在我看来它只对内存映射硬件有用。 最佳答案 Placement new 允许您在已分配的内存中构造一个对象。 当您需要构造一个
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
假设我有一个 MyStack 类公开了: class MyStack { public: template T* Push() { Reserve(sizeof(T)); // Make s
这里有人用过C++的“placement new”吗?如果是这样,为什么?在我看来它只对内存映射硬件有用。 最佳答案 Placement new 允许您在已分配的内存中构造一个对象。 当您需要构造一个
这里有人用过C++的“placement new”吗?如果是这样,为什么?在我看来它只对内存映射硬件有用。 最佳答案 Placement new 允许您在已分配的内存中构造一个对象。 当您需要构造一个
我正在创建一个受歧视的类 union 体。我使用的是 c++ 17,所以我可以在技术上使用 std::variant,但由于特定的用例,我希望每个变体的含义更加明确(特别是因为其中两种情况没有数据,除
尝试使用 placement new 但它一直给我错误。我记得不久前,它正在工作。 g++(版本 4.8.4)在 Ubuntu 14.04 上。 #include typedef unsigned
这里有人用过C++的“placement new”吗?如果是这样,为什么?在我看来它只对内存映射硬件有用。 最佳答案 Placement new 允许您在已分配的内存中构造一个对象。 当您需要构造一个
这个问题在这里已经有了答案: What uses are there for "placement new"? (25 个答案) 关闭 8 年前。 我有两个使用new运算符分配内存的案例。 clas
我有一 block 内存区域,将用于多个队列。比如我分配了1024字节的内存,需要两个队列。第一个队列将占用前 512 个字节,第二个队列将占用接下来的 512 个字节。 但是,我的队列由 C++ 类
我是一名优秀的程序员,十分优秀!