这个学期在学C++,我喜欢思考“内存”方面的事,而想来想去又想不通,思而不学则殆啊,也不知道我所想的各种古里古怪的细节问题是不是在编译原理那本书里。
1、指针
p+1时它知道是移动几个字节,它为什么会知道呢?于是我想指针变量存放的不仅有地址,还应该有指向的类型的大小方面的信息。
int a;
int *p =&a;
p + 1 时它知道是移4个字节,这个信息放在哪里?
2012/4/30
引:“为什么free()函数不像malloc()函数那样复杂呢?这是因为指针p的类型及它所指的内存容量事先都是知道的。”(出自林锐书)
貌似这个问题与第1个问题有些联系。
还有下面这段话似乎也有帮助:
“heap:操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。”
2、自增运算符
一个我不太有兴趣深究但很奇怪的问题:
int a = 1;
cout << a++ << a++ << endl;
请先目测输出是多少,再上机看看结果,太奇怪了。
3、常量
一本没有习题答案的书上的思考题:
什么样的常量在程序运行期间会象变量一样,需要用一片内存空间来存放,什么样的常量不需要?
要是哪位朋友看到了,有兴趣的话就给个回复吧,先说声谢谢了。我会把我学习过程中的怪问题记在这里的。看看什么时候自己能彻底理解解决。
2012/6/1
4、引用
const int &r = 6;
r是否要占内存空间?
ps:关于引用,发现一个好玩的用法:
int &r = *new int(76);
对用new创建的
无名实体建立一个引用,这里r是对无名整型变量的引用,初值是76。
2012/7/21
5、指针
关于字符指针与strcpy函数:
http://blog.csdn.net/justme0/article/details/7413707
今天更新的第二个没通过的例子。
2012/8/10
6、STL
看了string类的源码(头文件中),发现length()和size()就是一样的:
size_type length() const
{ // return length of sequence
return (this->_Mysize);
}
size_type size() const
{ // return length of sequence
return (this->_Mysize);
}
还有c_str()和data():
const _Elem *c_str() const
{ // return pointer to null-terminated nonmutable array
return (_Myptr());
}
const _Elem *data() const
{ // return pointer to nonmutable array
return (c_str());
}
它们返回的都是_Myprt()。
这两个成员函数,为什么要弄两个不同的名称呢?作用都是一样的啊。
7、const与引用
int *p = NULL;
const int *&q = p;
我的意图:
1)q是p的别名,不想让q占用新空间。
2)想让q指向的内容只读,不想让后面代码通过q来修改它指向的内容。(就是*q不能作为左值,当然*p可以作为左值)
这个要求为什么就不合法呢?错误是int *类型不能转换为const int *&类型。
8、动态分配空间
动态分配的问题:
int *p = (int *)malloc(10);
p = (int *)realloc(p, 100);
第二句扩容,若p之后的空间不足了,重新分配的空间首地址就不是p了,那么原来p所指的那块空间有没有释放?(没有释放就麻烦了,还得判断是不是原来的地址)
9、指针
为什么free一个野指针会出错?请问原理。
2012/10/30
10、 引用
#include <iostream>
using namespace std;
size_t CalcArraySize(char (&arr)[10])
{
size_t ans = sizeof(arr);
return ans;
}
int main(int argc, char **argv)
{
char array[10] = {'\0'};
size_t a = sizeof(array);
size_t b = CalcArraySize(array);
cout << a << endl
<< b << endl;
return 0;
}
与常量指针又是什么关系?我觉得引用真是怪,它实质上也是由指针来实现的吧?但上面的程序貌似用了一个指向数组名的引用,是不是这样?