c++学习 定位new表达式

在cpp中,new主要有3种用法:实例化一个对象;实例化一个数组;定位new表达式。在这里主要讨论第三种用法,定位new表达式。

定位new表达式,就是在内存中new一块地址,然后根据程序的需要,将大小适合的实例对象放到此内存块中操作的方法。在此我借用《cpp primer 3rd》中p347中的例子给予说明,不足之处,恳请各位读者斧正。

首先创建测试用的类Foo

//测试所用的类
class Foo
{
public:
    Foo(int val = 0)
    {
        _val = val;
    }

    void writeFoo()
    {
        cout<< "_val is " << _val << "wook";
        cout<< endl;
    }

private:
    int _val;
};

我们看到Foo有一个private对象_val;有一个打印到console的方法writeFoo。

然后是main函数。

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //创建char数组,大小为3个Foo
    char* buf = new char[sizeof(Foo) * 3];

    //sizeof(Foo)大小为4
    //cout<< sizeof(Foo) << endl;

    //实例化Foo对象,并将其放置到buf中第一个Foo“位置”处
    Foo* pb = new (buf) Foo(0);

    //cout<< pb << endl;
    pb->writeFoo();

    //实例化Foo对象,并将其放置到buf中第二个Foo“位置”处
    Foo* pb3 = new (buf + (sizeof(Foo) * 2)) Foo(2);

    //实例化Foo对象,并将其放置到buf中第一个Foo的“第二个位置处”
    //Foo* pb3 = new (buf + ((sizeof(Foo) * 2) -3)) Foo(2);

    //cout<< pb3 << endl;
    pb3->writeFoo();
    //cout<< *(buf + ((sizeof(Foo) * 2) - 3)) << endl;

    Foo* pb1 = new (buf + sizeof(Foo)) Foo(1);

    //cout<< *(buf + sizeof(Foo)) << endl;

    /*cout<< "*************" << endl;
    cout<< *(buf + ((sizeof(Foo) * 2) - 3)) << endl;
    cout<< "*************" << endl;*/

    /*for (int index(0); index != (sizeof(Foo) * 3); index++)
    {
        cout<< "*********   " << index << endl;
        cout<< *(buf + index) << endl;
        cout<< "*********" << endl;
    }*/

    //cout<< pb1 << endl;
    pb1->writeFoo();
    pb3->writeFoo();

    //cout<< pb3 << endl;
    //cout<< pb1 << endl;
    //cout<< pb3 << endl;

    //pb3->writeFoo();

    return a.exec();
}

16/25/44/45四行的输出为:

 1 _val is 0wook
 2 _val is 2wook
 3 _val is 1wook
 4 _val is 2wook

由此可见因为19行的实例化在第三个Foo的“位置”,第28行的实例化在第二个“位置”,两者之间没有重叠处。

时间: 2024-10-11 06:39:59

c++学习 定位new表达式的相关文章

C++拾遗--定位new表达式

C++拾遗--定位new表达式 前言 new表达式,默认下把内存开辟到堆区.使用定位new表达式,可以在指定地址区域(栈区.堆区.静态区)构造对象,这好比是把内存开辟到指定区域. 正文 定位new表达式的常见形式 new(address) type; new(address) type(initializers); new(address) type[size]; new(address) type[size]{braced initializer list}; 定位new表达式调用 void

深入学习Java8 Lambda表达式 -- 从函数式接口说起

希望本文能够成为Java8 Lambda表达式的快速入门指南. 函数式接口 理解Functional Interface(函数式接口,以下简称FI)是学习Java8 Lambda表达式的关键所在,所以放在最开始讨论.FI的定义其实很简单:任何接口,如果只包含唯一一个抽象方法,那么它就是一个FI.为了让编译器帮助我们确保一个接口满足FI的要求(也就是说有且仅有一个抽象方法),Java8提供了@FunctionalInterface注解.举个简单的例子,Runnable接口就是一个FI,下面是它的源

c++ 11学习笔记--Lambda 表达式(对比测试Lambda ,bind,Function Object)

所有c++ coder都应该为这个语法感到高兴,说的直白一点,Lambda 表达式就是函数对象的语法糖. 还是直接看对比栗子吧,抄袭的是msdn的官网 该示例使用 for_each 函数调用中嵌入的 lambda 向控制台打印 vector 对象中的每个元素是偶数还是奇数. 使用lambda #include <algorithm> #include <iostream> #include <vector> using namespace std; int main()

c++ 11学习笔记-- 常量表达式(constexpr)

最新在弄android ndk相关的,惊奇的发现最新的ndk10的版本已经gcc4.9了,我印象中,gcc4.8就支持C++0x11,14的支持,gcc再次走到了llvm的前面,LLVM最新的版本3.4.2应该只支持c++ 11,如果是同样的c++代码我一直认为llvm的效率会明显强过gcc. 废话不多说,让我们开始学习c++ 11吧,说实话我之前一直都很抗拒c++新的语法,感觉太难接受了,现在看来不熟悉也不行了. 常量表达式(constexpr) 常量表达式机制是为了: 提供了更多的通用的值不

Java语言编程学习之Lambda表达式设计和架构的原则[图]

Java语言编程学习之Lambda表达式设计和架构的原则[图]:大家都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各种各样.但是大多数的Java代码都不是由开发JDK的程序猿写的,而是像我们这样的普通程序猿.很多人都会碰到过这样的情况:你实现了一个新功能或修复了一个缺陷,并且对自己的修改很满意.但其他人看了你的代码后--也许发生在代码审查环节,完全不买账!对于什么是好代码,什么是坏代码,存在分歧很正常!设计模式的改变设计模式是人们熟悉的另一种设计思想,

JAVA8学习——深入浅出Lambda表达式(学习过程)

JAVA8学习--深入浅出Lambda表达式(学习过程) lambda表达式: 我们为什么要用lambda表达式 在JAVA中,我们无法将函数作为参数传递给一个方法,也无法声明返回一个函数的方法. 在JavaScript中,函数参数是一个函数,返回值是另一个函数的情况下非常常见的,JavaScript是一门非常典型的函数式编程语言,面向对象的语言 //如,JS中的函数作为参数 a.execute(callback(event){ event... }) Java匿名内部类实例 后面补充一个匿名内

java学习笔记—EL表达式(38)

EL表达式 EL即Expression Language,主要的任务是帮助开发者简化获取域属性. 但是一般情况下需要使用EL和JSTL结合使用. 语法: ${ // 隐含对象|直接写域中的属性 } ? 算术运算 <!-- 算术运算 --> 20+10 = ${ 20+10 } <br/> 20-10 = ${ 20-10 } <br/> 20*10 = ${ 20*10 } <br/> 20/10 = ${ 20/10 } <br/> 20%10

python学习2 lambda表达式

学习C#的,对这个就特别熟悉了 lambda函数,它没有名字,只有参数和表达式: lambda  args: expression def func1(func,arg): return func(arg) print func1(lambda a:'hello '+a, 'aven') input() 和.Net相比,这个lambda只支持表达式(expression)而不支持语句块(statement)

[C++]placement new 定位new 表达式

默认的new 把内存开辟到堆区,大小可以指定,也就是做两件事情:(1)分配内存.(2)在分配好的内存上构建对象.原型如下: void *operator new( size_t, void * p ) throw() { return p; } placement new 是new的一个变体,它将两者分开来做.在placement new中,我们可以传递一个已经分配好的内存然后在这个内存上构建对象.这样,可以在指定地址区域(栈区.堆区.静态区)构造对象,这个构建过程不需要额外分配内存,只需要调用