今天看到《c++ primer》上关于字符串的介绍,才惊讶的发现自己之前的很多观念是错误的,现有项目的一些细节也忽略了
1:释放数组指针记得是使用 delete [] pia,虽然早就知道这一点,但是在项目中有时候还是忘记数组指针的释放方法,很轻易的就使用 delete pia进行指针的释放,造成内存泄露了,对于多维数组pia[][],或者类似形式的int** pia = new int[rows][cols],要进行如下形式的资源释放
for (int i = 0 ;i < rows;i++)
{
delete [] pia[i];
}
delete [] pia;
对于 int *p = new int[num],这种指针一定要清醒的认识到这是数组指针,所以要使用delete []p;进行删除。
同样的像这样的指针
int a =3;
int *p =&a;
delete p;
这样的指针p就不能也不用删除了
另外指针删除要注意的几点是:不能重复删除同一个指针,删除指针时,指针要指向最初创建的指针的地址,对于这点可以参考这篇文章:
http://www.cnblogs.com/JCSU/articles/1051729.html
2:c++中c语言风格的字符串都是以'\0'标志结束的,你创建下面一个数组也是可以的
char c[] = {'c','+','+'};
虽然创建时可以的,但是当调用标准库函数时就会引发无法预知的错误,比如调用strlen(c), c是一个没有null结束的字符串,所以当调用该函数时,系统会从c指向的内存地址开始搜索,直到遇到字符null为止,很明显这是错误的。
同样的使用strcmp,strcat,strncat,strcpy,strncpy也会引发错误。
对于strcpy跟strncpy还有几点要另外注意。strcpy(s1,s2)是将s2复制到s1,要求s1的占用的空间要大于等于s2,同时要保证结束符'\0'的复制。因此如果我们使用strlen获取s2字符长度n用于创建s1时,一定要使得n+1,因为strlen获取的s的长度,并不包括'\0',而s1是要以'\0'结尾的,像下面的最做法才是正确的
const char *from ="abcde";
int len = strlen(from);
char *to = new char[len + 1];
strcpy(to ,from);
//或者是 strncpy(to ,from ,len+1);
如果创建的to数组的大小,小于或者等于len,肯定是错误的,因为from剩下的字符就覆盖到了to数组外的地址去了,可能造成不可预知的错误。值得注意的一点是即使是使用strncpy当s1的长度等于len时,实现结果跟使用strcpy创建len长度的数组是一样的, 虽然表面上s1达到的预期的效果,但是复制过程中from数组的结束符'\0',还是复制到了to以下的空间,造成了内存操作的混乱。
3:关于动态分配的数组的初始化,如果数组元素是类类型,比如string(曾经混淆string是否是类类型),将调用该类的默认构造方法进行初始化,如果元素是基本数据类型,也就是内置类型,则无初始化。
string *s = new string[10]; //调用默认构造方法进行初始化。默认为""
int *i = new int[10]; //没有初始化
另外可以
int *i = new int[10]();
可以这样使用圆括号进行初始化,该例子被元素初始化为0.
对于const对象的动态数组,数组元素同样也是内置类型的话,就必须使用圆括号进行初始化了。
const int *i = new cosnt int[10]();
类类型可以不加圆括号,因为他们会默认调用构造方法进行初始化了。
分享到:
相关推荐
学习了C++中的字符串加密解密后,可以进一步研究其他加密算法,如AES、RSA等,或者了解非对称加密和哈希函数等信息安全相关的概念和技术。此外,也可以尝试将加密解密技术应用到实际项目中,如网络通信的安全传输、...
本篇将详细探讨如何使用C++实现字符串的倒序,以及相关的C++字符串操作知识。 首先,我们要理解C++中字符串的基本概念。在C++中,字符串通常由字符数组表示,可以使用`char`类型的数组或`std::string`类来处理。`...
### C++字符串完全指南 #### 一、Win32字符编码概述 在计算机科学中,字符串是一系列字符的集合,通常被用来表示文本。在C++编程语言中,字符串可以通过多种方式进行表示,包括传统的C风格字符串、标准模板库(STL)...
#### 字符串连接的基本概念 在编程语言中,字符串连接是指将两个或多个字符串合并成一个新的字符串的过程。在C++中,可以使用多种方法来实现字符串的连接: 1. **使用`+`运算符**:这是最直观的方法之一,可以直接...
C/C++语言本身并没有专门的字符串变量类型,而是使用字符数组来存放字符串,其中字符串的结束符是“\0”(空字符)。掌握字符与数字之间的转换对于进行有效编程至关重要,尤其在处理用户输入、数据输出以及与其他...
2. **字符串类构造函数**:C++的`std::string`类提供了一些构造函数,如无参数的构造函数创建空字符串,字符数组或另一个字符串的复制构造函数等。`字符串类构造函数.cpp`可能包含了各种构造函数的使用示例,帮助...
### 使用C++比较两个字符串的大小 在C++编程语言中,比较字符串是常见的操作之一。本篇文章将基于提供的代码示例,详细解释如何通过指针和`for`循环来比较两个字符串的大小。 #### 代码解读 首先,让我们详细了解...
在C++编程中,`std::string`是一个非常重要的数据类型,用于表示和操作字符串。本文将详细解析两种常用的C++ `std::string`截取字符串的方法:`find`和`find_last_of`,以及如何结合使用它们来满足各种字符串处理...
在C++编程语言中,字符串处理是至关重要的一个部分,涉及到很多函数和...以上是C++字符串处理的基础知识,实际编程中还会遇到更多复杂情况,如宽字符、多字节字符集、正则表达式等,这些都需要根据具体需求学习和掌握。
以下是使用回溯法实现C++字符串排列的伪代码: ```cpp void permute(string str, int start) { if (start == str.size()) { // 打印或处理排列 cout ; return; } for (int i = start; i (); i++) { swap...
在C++编程中,字符串与类的映射是一种高级技巧,通常用于动态绑定或反射机制。反射允许程序在运行时检查自身的结构,如类、函数和变量,这在元编程和自描述代码中非常有用。以下我们将深入探讨如何实现字符串到类的...
首先,我们需要理解字符串偏移的概念。假设我们有一个字符数组,偏移1意味着将每个字符向前移动一位,最前面的字符移到数组末尾。在ASCII码表中,字符之间有一定的顺序,例如'a'后面是'b','z'后面是' '(空格)。...
C++字符串教程旨在帮助初学者和经验丰富的开发者更好地理解和运用字符串功能。本教程将深入探讨C++中的字符串处理,包括基本概念、操作方法以及在实际项目中的应用。 一、C++字符串基础 1. C++标准库中的`std::...
一、C++字符串基础 1. C++中的字符串类型: C++支持两种主要的字符串类型:C风格字符串(char数组)和C++标准库中的`std::string`。C风格字符串以空字符'\0'结尾,而`std::string`是一个类模板,提供了丰富的成员...
下面我们将详细探讨C++中的字符串概念、字符串操作以及如何读取字符串。 1. **C++字符串基础** 在C++中,字符串是由字符组成的序列,通常以空字符'\0'作为结束标志。C++标准库提供了`std::string`类来处理字符串,...
本文将深入探讨C++中的字符串查找这一重要主题,这对于初学者理解和掌握C++编程至关重要。 字符串在C++中是字符数组的特殊形式,它用于存储文本数据。在处理字符串时,我们经常需要查找特定的子串或字符,这是字符...
在C++编程中,字符串处理是一项基础且重要的任务。本文将深入探讨如何在C++中进行字符串的读写操作,特别是在文件系统中的应用。我们将会分析一个名为"fileTest3"的示例程序,它展示了如何创建新文件,将特定格式的...
在C++编程中,字符和字符串的处理是至关重要的,特别是在处理不同的字符集时,如宽字符和多字符集。标题和描述中提到的关键概念包括LPTSTR、LPCSTR、LPCTSTR和LPSTR,这些都是在Windows API中常见的字符串类型指针。...
下面将详细讨论C++字符串的基本概念、常用操作以及一些高级特性。 首先,C++中的字符串有两种主要类型:C风格的字符数组(char*)和C++标准库中的std::string类。C风格的字符串以空字符'\0'结尾,而std::string类则...