求教个关于string和memcpy的问题
我在一个类里定义了一个string数组 stdName[5],在构造函数里使用了
string tempString[5]={"Name0","Name1","Name2","Name3","Name4"};
memcpy(stdName,tempString,sizeof(tempString));
在析构的时候会报错
Debug Assertion Failed!
Program:E:\gyb.2.5\hotfoxd.exe
File:dbgdel.cpp
Line:52
Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
后来我把赋值方式改成为成员单独赋值就不再有问题,
我想问下这是为什么,还有像这种在类里面的string数组如何初始化比较方便呢。 string memcpy
[解决办法]
你可能没有完全理解String类的概念。
memcpy(stdName,tempString,sizeof(tempString));
这样赋值后,stdName[0]没有分配内存,类里面的内存指针指向tempString[0]的内存了。析构的时候,tempString[0]删除一次内存,stdName[0]也删除一次内存,就导致出错了。
如果这样赋值:stdName[0] = tempString[0],stdName[0]就可以在赋值前先分配一块新的内存,然后把tempString[0]里的字符串拷贝到新内存了,最后析构的时候大家各删各的内存,就不会出错。
[解决办法]
使用已经delete的内存,并非绝对会出错,而是说随时可能出错。
你的代码:
string tempString[5]={"Name0","Name1","Name2","Name3","Name4"};
tempString为局部变量,但是其内部指针指向的可能是常字符串,对常字符串的处理,这个没有规定是否放在堆中还是其他地方(如栈),如果不在堆中,那么你事实上可以传递这个指针出去。但是这样做依然是没有保障的,也就是可能这个版本的BCB可行,或许下个版本的就不可行了,或者是DEBUG版可行,优化版的release版就不行了。
不遵守规范的结果不一定出错,但是遵守规范就一定不会出错,这是编译器要保障的。你可不希望你的程序时对时错吧。