编程时踩过的坑(主要是c++)

1.数值溢出

存储数据时要考虑数值溢出的问题,选择合适的类型,特别要注意数值运算时的数值范围是否合适。比方说,如果使用了int类型,尽管数据本身没有超范围,但是在进行乘法计算时却可能会产生数值溢出。

c++类型的数值范围速查表:

Type Typical Bit Width Typical Range
char 1byte -127 to 127 or 0 to 255
unsigned char 1byte 0 to 255
signed char 1byte -127 to 127
(signed) int 4bytes -2147483648 to 2147483647,约10^9,或+/- 2^31
unsigned int 4bytes 0 to 4294967295,约10^9,或2^32
(signed) short int 2bytes -32768 to 32767
unsigned short int 2bytes 0 to 65,535
(signed) long int 4bytes -2,147,483,648 to 2,147,483,647
unsigned long int 4bytes 0 to 4,294,967,295
(signed) long long 8bytes -9223372036854775808 to +9223372036854775807,约10^18,或+/- 2^63
unsigned long long 8bytes 0 to 1844674407370955161,约10^18,或2^64
float 4bytes +/- 3.4e +/- 38 (~7 digits)
double 8bytes +/- 1.7e +/- 308 (~15 digits)
long double 8bytes +/- 1.7e +/- 308 (~15 digits)
wchar_t 2 or 4 bytes 1 wide character

 

2.memset初始化

在做一些编程题时,有时会定义一个全局的大数组并重复使用,这时要记得在每个case开始时用memset函数初始化一下。否则会产生很隐蔽的bug。

 

3.函数栈溢出

我们知道函数的局部变量是存储在栈空间里的,而栈空间一般只有4Mb或者8Mb(跟系统有关)。所以当函数局部变量定义得过大(例如一个大数组),就很容易导致栈溢出错误。除此之外,函数的递归深度过大也会导致栈溢出。

这里复习一下,一个由C/C++编译的程序占用的内存分为以下几个部分:

 1、栈区(stack):又编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。

 2、堆区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。

 3、全局区(static):也叫静态数据内存空间,存储全局变量和静态变量,全局变量和静态变量的存储是放一块的,初始化的全局变量和静态变量放一块区域,没有初始化的在相邻的另一块区域,程序结束后由系统释放。

 4、文字常量区:常量字符串就是放在这里,程序结束后由系统释放。

 5、程序代码区:存放函数体的二进制代码。

 

4.make_pair出错

string str = "asd";
int pos = 1;
make_pair<string, int>(str, pos);

上面的代码会报错:no matching function for call to 'make_pair(std::string&, size_t&)',这是因为make_pair在c++11前后修改了声明:

// 定义于头文件 <utility>
// C++11前
template< class T1, class T2 >
std::pair<T1,T2> make_pair( T1 t, T2 u );
// C++11起,C++14前
template< class T1, class T2 >
std::pair<V1,V2> make_pair( T1&& t, T2&& u );
// C++14起
template< class T1, class T2 >
constexpr std::pair<V1,V2> make_pair( T1&& t, T2&& u );

对于该错误,有两种修改方式:

1、make_pair(str, pos)

2、make_pair<string, int>(string(str), int(pos))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章