new delete 直接管理的内存的规则

primer 5th 12.6练习代码

#include <iostream>
#include <algorithm>
#include<memory>
#include<vector>
using std::vector;
using std::cin; using std::cout;
using std::endl;

vector<int>* factory(int i)
{
    ;
    return new vector<int>{i};
}

vector<int>* use_factory(int i)
{
    vector<int>* p=factory(i);
    for(int ret;cin>>ret;p->push_back(ret)) ;
    return p;
}

void use_two_factory(int i)
{
    auto it=use_factory(i);
    for(const auto& c:*it)  cout<<c<<" ";
    cout<<endl;
    delete it;
    it=nullptr;
}
/***************************************************************************
 *  @file       The code is for the exercises in C++ Primmer 5th Edition
 *  @author     Alan.W
 *  @date       22  DEC 2013
 *  @remark
 ***************************************************************************/
//!
//! Exercise 12.6:
//! Write a function that returns a dynamically allocated vector of ints.
//! Pass that vector to another function that reads the standard input to
//! give values to the elements. Pass the vector to another function to print
//! the values that were read.
//! Remember to delete the vector at the appropriate time.
//!

#include <iostream>
#include <vector>
#include <string>
#include <memory>

std::vector<int>* dynamic_vector_generator();

void dynamic_vector_processor(std::vector<int>* ptr_v);

void dynamic_vector_printer(std::vector<int>* ptr_v);

int main()
{
    /**
      * testing the 3 functions
      */
    std::vector<int>* ptr_vi = dynamic_vector_generator();
    dynamic_vector_processor(ptr_vi);
    dynamic_vector_printer(ptr_vi);

    delete ptr_vi;

    return 0;
}

/**
 *  @brief  return a pointer to dynamicly allocated vector of ints
 */
std::vector<int>* dynamic_vector_generator()
{
    std::vector<int>* ptr_v = new std::vector<int>();
    return ptr_v;
}

/**
 * @brief return a pointer to vector of ints
 * @param ptr_v pointer to vector of ints
 */
void dynamic_vector_processor(std::vector<int>* ptr_v)
{
    int i;
    std::cout << "plz enter:\n";
    while (std::cin >> i && i != 999) ptr_v->push_back(i);
}

/**
 * @brief print the content of the vector that ptr_v points to
 * @param ptr_v
 */
void dynamic_vector_printer(std::vector<int>* ptr_v)
{
    for (const auto& e : *ptr_v) std::cout << e << " ";
    std::cout << "\n";
}

使用new分配内存,delete释放new分配的内存。使用这两个运算符管理内存非常容易出错,自己管理内存的类与使用智能指针的类不同,它们不能依赖类对象拷贝,赋值和销毁操作的默认定义。

1.使用new动态分配和初始化对象:

默认动态分配的对象是默认初始化的,因此内置类型(如int)和组合类型的对象的值将是未定义的,而类类型的对象将由默认构造函数进行初始化:

string *ps=new string; //空string;

int *pi-new int; //Pi指向一个未初始化的int

初始化方式:直接初始化 int *pi=new int(1024);

列表初始化: vector<int> *pv=new vector<int> {0,1,2,3,4,5,6,7,8,9};

进行值初始化(默认),在类型名后面跟一对空括号: int *pi1=new int();  //默认初始化为0;*pi1为0;

使用auto:括号中包含单一初始化器使从此推断我们想要分配的对象的类型。 auto p1=new auto(obj);//p指向与obj相同的对象,该对象用obj进行初始化;p1是指针,obj是string,p1是string*;

2.动态分配的const :

const对象必须进行初始化 const int* pci=new const int(1024);

const string *pcs=new const string;

分配对象是const的,new返回一个指向一个const 的指针。

释放const对象: delete pci;

3.释放动态内存:

delete将动态内存归还给系统。delete p;// p必须指向一个动态分配对象或是一个空指针;

两个动作:销毁给定的指针指向的对象;释放对应的内存。

4.未定义的行为:释放一块并非new分配的内存,或者将相同的指针释放多次。编译器无法区分出这两种情况。

5:动态对象的生存期直到被释放为止。

对于智能指针:shared_ptr管理的内存在最后一个shared_ptr销毁时会被自动释放。

内置指针类型管理的内存:动态对象直到被显示释放之前它都是存在的。以下都是此类:

返回指向动态内存的指针的函数给调用者增加了额外负担,调用者必须记得释放内存。调用此函数时,使用了指针而不delete,离开作用域时局部变量指针被销毁,而不会发生什么,动态内存在显示释放之前一直会存在;

在调用函数中必须记得释放内存,否则指向这块内存的指针被销毁则没有办法释放这块内存了。如果还有其他代码要使用这个指针,则返回一个指针,指向它分配的内存。

时间: 2024-10-23 12:55:57

new delete 直接管理的内存的规则的相关文章

C++ 管理数据内存的方法

C++有3种管理数据内存的方式:自动存储.静态存储和动态存储(有时也叫做自由存储空间或堆heap) 1. 自动存储 自动变量是一个局部变量,作用域为包含它的代码块. 自动变量通常存储在栈中,执行代码块时,其中的变量依次加入到栈中,离开代码块时,按相反的顺序释放这些变量,这被称为后进先出(LIFO). 2. 静态存储 静态存储是整个程序执行期间都存在的存储方式.使变量成为静态的方式有两种:一种是在函数外定义:一种是在声明变量时使用关键字static. 3. 动态存储 指由new和delete管理的

内存管理之内存池概述(转)

原文链接:http://www.xiaoyaochong.net/wordpress/index.php/2013/08/10/%E5%BC%95%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86%E4%B9%8B%E5%86%85%E5%AD%98%E6%B1%A0%E6%A6%82%E8%BF%B0/ 在我们编写代码的过程中,不可避免的要和内存打交道,在申请释放不太频繁的情况下,通常让系统进行内存管理即可.但是,直接使用系统调用malloc/free.new/delet

内存管理:内存泄漏和空悬指针

********内存管理基础********************* 内存管理:针对的是实例的内存占用的管理(放在堆里面) 实例:1:由class类型构建的实例,2:闭包对象 内存管理技术:ARC:Automatic Reference Count 自动:由语言本身帮我们销毁内存,不需要你手动销毁, 比如在c中就调用dealloc() 引用:let p = Person()  p就是对Person()这个对象的一个引用 计数: let p = Person() //一个 / / let pp

Linux内存管理 (一) 内存组织

内存管理是内核最复杂同时也是最重要的一部.其特点在于非常需要处理器和内核之间的协作. 首先内存划分为结点,在内核中表示为pg_data_t,每个结点划分为内存域. 以下的所有数据结构或代码都做了不同程度的精减,一方面是为了保留相关代码,除去细枝末叶,另一方面是为了美观. 结点的数据结构为 <mmzone.h>typedef struct pglist_data { struct zone node_zones[MAX_NR_ZONES]; /*内存结点所包含的内存域数组*/ struct zo

C++ Primer 学习笔记_29_操作符重载与转换(4)--转换构造函数和类型转换运算符归纳、operator new 和 operator delete 实现一个简单内存泄漏跟踪器

C++ Primer 学习笔记_29_操作符重载与转换(4)--转换构造函数和类型转换运算符归纳.operator new 和 operator delete 实现一个简单内存泄漏跟踪器 一.转换构造函数 可以用单个实参来调用的构造函数定义从形参类型到该类型的一个隐式转换.如下: class Integral { public: Integral (int = 0); //转换构造函数 private: int real; }; Integral A = 1; //调用转换构造函数将1转换为In

Oracle Study之--IPCS管理共享内存

Oracle Study之--IPCS管理共享内存 Unix/linux下的共享内存.信号量.队列信息管理 在unix/linux下,经常有因为共享内存.信号量,队列等共享信息没有干净地清除而引起一些问题. 查看共享信息的内存的命令是:ipcs [-m|-s|-q]. 默认会列出共享内存.信号量,队列信息 -m列出共享内存 -s列出共享信号量 -q列出共享队列 清除命令是:ipcrm [-m|-s|-q] id. -m 删除共享内存 -s删除共享信号量 -q删除共享队列. 案例分析: [[ema

【ThinkingInC++】64、重载new和delete,来模仿内存的分配

/** * 书本:[ThinkingInC++] * 功能:重载new和delete,来模仿内存的分配 * 时间:2014年10月5日14:30:11 * 作者:cutter_point */ #include <cstddef> //size_t这个类型的使用 #include <fstream> #include <iostream> #include <new> using namespace std; ofstream out("Frami

一个依靠STL vector的接口进行申请和回收管理的内存池类( c++ 封装)

其他出现两次,只有一个出现一次的那道题我就不更了,直接抑或,最后的结果就是那个数.为什么可以这样做呢?因为一个32位int,如果所有数都出现了两次,那么为1的那些位统计的个数一定是2的倍数,抑或之后全变成0.一个数出现了一次,它为1的那些位上,1的个数必定是奇数,抑或之后一定还是1. 我之前知道出现两次这个题的解法,但是理解的不够深,以为抑或是关键,其实不是,出现了偶数次才是关键.理解了这点,推广到出现3次上,如果所有的出现了三次,那么为1的那些位1的个数一定是三的倍数,那如果有一个数出现了一次

java基础---JVM内存管理以及内存运行机制学习总结

自己从网上搜资料拼接了一张JVM内存图:如下图所示: 我们思考几个问题: 1.jVM是怎么运行的? 2.JVM运行时内存是怎么分配的? 3.我们写的java代码(类,对象,方法,常量,变量等等)最终存放在哪个区? VM运行时数据区域: 1.程序计数器(program Counter Register):   是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的 方式去实 现),字节码解释器工作时就是通过改