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; }