Boolan C++面向对象高级编程(下)第一周作业

上一周作业需要的知识:

1.内存对齐

指的是指数据存储在内存时的起始地址是否是某个值的整数倍。如果只是放在内存中,是否对齐本身并没有什么问题。问题是读取、写入的时候。访问一个不对齐的数据(unaligned memory access)可能会导致程序运行效率慢,结果出错,甚至是程序当掉。

内存对齐的规则

(1).对于结构的各个成员,第一个成员位于偏移为0的位置,以后的每个数据成员的偏移量必须是 min(#pragma pack()指定的数,这个数据成员的自身长度)的倍数;

(2).在所有的数据成员完成各自对齐之后,结构或联合体本身也要进行对齐,对齐将按照 #pragram pack 指定的数值和结构或者联合体最大数据成员长度中比较小的那个,也就是  min(#pragram pack() , 长度最长的数据成员)。#pragram pack(n)表示的是设置n字节对齐,vc6默认的是8。

2.含有虚函数的类在创建对象时会被分配一个虚指针(vptr),虚指针指向虚函数列表(vtbl),虚函数列表存放该类含有的虚函数。

3.32位系统指针的大小是4bytes, 64位系统指针的大小是8bytes。

我觉得整理书上或者课程的ppt的知识点就是又抄了一遍,对提升编程技能不是很有用。老师的ppt已经很好了,在上面做点批注就足够复习用,没必要再在别的笔记里重复。所以我这周开始就把C++ Primer里面与课程相关的习题做一下,把有错误或是需要注意的代码整理在笔记里(写对的就不总结了),这样可以在做题的时候应用知识点,也方便以后复习自己出错的地方,会比较直观。

这一周老师讲了C++对象模型,重载new和delete, const等。我把C++ Primer第十二章的知识点复习了一遍,习题重新做了一遍。这一章讨论的是动态内存与智能指针,涉及到了new和delete的相关知识。这一次重做让我发现即使以前写过这些题,现在再写也是有些细节的地方也还是会忽略,还有就是有一部分学过的知识已经忘了,需要再看看。但同时欣慰的是,我看上一次我写的答案,发现好多当时不懂的现在都懂了。

C++ Primer 第十二章 动态内存与智能指针 习题笔记

P411 E12.6

 

// P411 E12.6.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;

vector<int>* new_vector()
{
    //看了P317 9.4vector对象是如何增长的,就可以理解这里为什么
    //可以new一个vector<int>而不用管vector的大小
    return new vector<int>;
}

void write(vector<int> *pv)
{
    int i;
    while (cin >> i)
        pv->push_back(i);
}

/*
//我觉得这个函数带一个istream或ostream的参数没有必要
//上面write的那种形式更好
void write(istream& is,vector<int> *pv)
{
int i;
//一开始没写循环,导致只读了一个数进去
is >> i;
pv->push_back(i);
}
*/

void read(vector<int> *pv)
{
    for (auto b = pv->begin(); b != pv->end(); b++)
    {
        cout << *b << " ";
    }
}

int main()
{
    vector<int> *pv = new_vector();
    write(pv);
    read(pv);
    delete pv;
    pv = nullptr;

    return 0;
}

 

P411 E12.7

// P411 E12.7.cpp: 定义控制台应用程序的入口点。
//使用智能指针的好处就是省去了delete指针的负担
//如果代码很多很复杂的话,难免忘记手动delete,
//会造成内存泄漏,使用智能指针就不用有这种担心

#include "stdafx.h"
#include <vector>
#include <memory>
#include <iostream>

using namespace std;

shared_ptr<vector<int>> new_vector(void)
{
    shared_ptr<vector<int>> p = make_shared<vector<int>> ();
    return p;
}

void write(shared_ptr<vector<int>> p)
{
    int i;
    while (cin >> i)
        p->push_back(i);
}

void read(shared_ptr<vector<int>> p)
{
    for (auto i : *p)
        cout << i << " ";
}

int main()
{
    shared_ptr<vector<int>> p = new_vector();
    write(p);
    read(p);

    return 0;
}

 

P411 E12.8

//这段代码想通过new的返回值来判断new是否成功分配内存
//但普通new失败即抛出异常bad_alloc,不返回nullptr
//可以把普通的new改成new(nothrow) int来实现这个目的
//答案上面说应该“通过捕获异常或者判断返回的指针来返回true
//或false,而不是依赖类型转换”,我还不太懂
bool b()
{
    int *p = new int;
    //...
    return p;
}

 P426 E12.23

#include<cstring>
#include<memory>
#include<iostream>
using namespace std;

//P39 'a' character literal; "a" string literal
int main()
{
    const char* c1 = "hello ";
    const char* c2 = "world";
    
    char *p = new char[strlen(c1) + strlen(c2) + 1];//
    strcpy(p, c1);//strcpy和strcat的用法
    strcat(p, c2);
    cout << p << endl;

    string s1 = "hello ";
    string s2 = "world";
    strcpy(p, (s1 + s2).c_str());//得到指向string头的指针c_str()
    cout << p << endl;

    delete[]p;//array new 一定搭配array delete  
     

    system("pause");
    return 0;
}

 

posted @ 2018-02-05 09:28  Dana_is_a_painter  阅读(198)  评论(0编辑  收藏  举报