(7)size_t:
size_t 虽然在标准C中定义,但实际使用中一直是一个不太容易灵活应用的内容。
size_t类型是一个类型定义,通常将一些无符号的整形定义为size_t,比如说unsigned int或者unsigned long,甚至unsigned long long。
参看这篇文章:
why size_t matters
一般提到size_t 都说提高代码的可移植性, 有效性和可读性,(主要是可移植性)
在大部分机器上,unsigned int的最大值要比int的最大值大两倍,比如说再也给16位的机器上,unsigned int的最大值为65535,int的最大值为32767。
int在大部分机器上可以移行,但例如在摩托罗拉IP16L32平台上并非如此,(详细省略)
size_t类型是一个类型定义,通常将一些无符号的整形定义为size_t,比如说unsigned int或者unsigned long,甚至unsigned long long。
常用例子:
void *memcpy(void *s1, void const *s2, size_t n);
size_t strlen(char const *s);
void *malloc(size_t n);
size_t的定义在<stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, <time.h>和<wchar.h>这些标准C头文件中,
(8)智能指针:
为何需要智能指针?
内存管理是常见错误和Bug来源,很多BUG来自动态内存分配和指针的使用。
广泛使用动态内存分配(使用容器等)后,很容易忘记每个指针只在正确时间执行一次delete 操作。出错的后果是多次释放动态分配的内存时,有可能会导致内存损坏或者致命的运行时错误,而当忘记释放动态内存分配,则会导致内存泄漏。
智能指针可以帮助管理动态内存的分配,避免内存泄漏。
auto_ptr: 废妃
unique_ptr:
🌰
void notLeaky()
{
auto mySimpleSmartPtr = make_unique<Simple>();
mySimpleSmartPtr->go();
}
如果编译器不支持make_unique(),则采用:
🌰
unique_ptr<Simple> mySimpleSmartPtr(new Simple());
shared_ptr:
用make_shared()创建🌰
auto mySimpleSmartPtr = make_shared<Simple>();
带有自动释放功能
int main()
{
shared_ptr<int> myIntSmartPtr(malloc_int(42),free);
return 0;
}
一个用于文件操作的🌰
void CloseFile(FILE* filePtr)
{
if (filePtr == nullptr)
return;
fclose(filePtr);
cout << "closed" << endl;
}
int main()
{
FILE* f = fopen("data.txt", "w");
shared_ptr<FILE> filePTr(f, CloseFile);
// 以下省略
//......
return 0;
}
其他还有weak_ptr, Nothing 引用计数
**实用上讲,shared_ptr 对于指针的释放操作比较方便.
(9)常见内存陷阱:
-分配不足的字符串
-访问内存越界
-内存泄漏
-双重删除、无效指针
**内存另外开辟专题文章
网友评论