读书人

关于char str[255]与char* str = new

发布时间: 2012-03-04 11:13:34 作者: rapoo

关于char str[255]与char* str = new char[255]的问题..

C/C++ code
小弟在内存管理方面不怎么明白,假设我在某个函数里面,如:void func(char* _str){    // 字符串指向内容、地址是否为空的判断(是这样判断吗?我希望这个里面有合法的值)    if ( NULL == *_str || NULL == _str )        return ;    // 下面是关于strcpy、ZeroMemory和vector合起来运用的一些疑问    char tempStr[255];    vector<char *> vctStr;    strcpy(tempStr, _str);    vctStr.push_back(tempStr);    // 昨晚上面这些,我需要将tempStr清空吗?    ZeroMemory(tempStr, strlen(tempStr));// 这里清空时strlen(tempStr)需要+1吗? +1的话是不是会把结束符'\0'给清除掉,下次就没结束符了?    // 这里清空以后,vecStr里面压入的的内容也会被清空,如果不清空的话,像这种局部字符数组变量应该是不会照成内存泄露的对吗?    // 假设上面不用tempStr[255],而用new出来的*tempStr    char *tempStr = new char[strlen(_str) + 1];    vector<char *> vecStr;    strcpy(tempStr, _str);    vctStr.push_back(tempStr);    // 这样的话就必须要删除了new出来的temStr了,不然肯定会有内存泄露,但是删除了的话,vecStr里面也空了    // 也就是说只能用tempStr[255]这种,不过又浪费了很多空间,没必要一定用255大小,请问如何能精确到该用多少用多少呢??}


[解决办法]
// 字符串指向内容、地址是否为空的判断(是这样判断吗?我希望这个里面有合法的值)
if ( NULL == _str || *_str == '\0')

直接用std::string
[解决办法]
NULL == _str//用这个来判断地址是否为空
*_str == '\0'//用这个来判断字符串是否为空
[解决办法]
// 昨晚上面这些,我需要将tempStr清空吗?

memset就行把?

// 这样的话就必须要删除了new出来的temStr了,不然肯定会有内存泄露,但是删除了的话,vecStr里面也空了

每一次new不一样的空间 数据使用完才需要delete把

[解决办法]
第一个 判断 指针是否为空就行了 *_str指的是 这个字符串的头地址,如果是个空字符串,那么第一个值就是'\0'所以这样判断的话 空字符串就会被直接返回掉了

vector<char *> vctStr这个就没必要了 如果是个字符串 那么直接用string就可以了
真想测试vector的概念 里头的也直接用char就行 你用了char* 那么只是一个指针,其指向的地址是原来字符串里面的每一个字符

在你第一个ZeroMemory就会把vctStr里面的东西全部的值全变成0.

strlen是从你开始字符指针的位置开始算起 一直搜索到\0 把\0之前的个数输出出来 strnlen是把\0也算上,你这里清空+1还是不+1结果都一样.

最后面那用法非常危险 new[]的东西存到vector 在你做delete的时候 只要把第一个 delete[]就全部删掉了,如果单独每个去delete必挂

感觉整体逻辑很乱

首先你得理解ZeroMemory不是delete 而是把 一段内存里面的参数全部设置成0
结果等同memset

字符串 的结构是 以字符开始到\0为止,也就是为什么命名规则对字符串用sz来命名,也就是string zero

还有指针以及值的概念,建议好好看下书,把概念弄懂了

对于变长字符串直接用string就够了 如果想知道里面概念 去看下STL实现的代码吧,每个VS里面都有所有STL模板实现的代码


[解决办法]
楼主你错了很多。。。。手机上网,不能指出。。。楼主属于学了一点C然后跳过来学C 的,鉴定完毕,帮顶。。。
[解决办法]
// 也就是说只能用tempStr[255]这种,不过又浪费了很多空间,没必要一定用255大小,请问如何能精确到该用多少用多少呢??
那就动态分配内存呀
[解决办法]
探讨

引用:
// 昨晚上面这些,我需要将tempStr清空吗?

memset就行把?

// 这样的话就必须要删除了new出来的temStr了,不然肯定会有内存泄露,但是删除了的话,vecStr里面也空了

每一次new不一样的空间 数据使用完才需要delete把
现在new出来的temStr我用完了,它里面的数据我也压入了vector里边,那为什么……

[解决办法]
探讨
TO wurh80
(无名剑)

很感谢你的指点,可能我对于指针的概率还比较模糊,不过我现在很想知道一个问题
void func()
{
char tempStr[255];
ZeroMemory(tempStr, strlen(tempStr));
}// 函数结束时为什么会报错?
报错:Run-Time Check Failure #2 - Stack aroun……

[解决办法]
static char tempStr[255];
在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可。


[解决办法]
一般char tempStr[255];
这样的定义我都会写成
char tempStr[255] = "";
这样一开始这个字符串就是空的了
至于这种结构要把255个全部清空


可以写成
ZeroMemory(tempStr, sizeof(tempStr));
[解决办法]
哎!不想说了!

读书人网 >C++

热点推荐