为啥我在删除 char* 时出现内存异常
Posted
技术标签:
【中文标题】为啥我在删除 char* 时出现内存异常【英文标题】:Why am I getting a memory exception on deleting a char*为什么我在删除 char* 时出现内存异常 【发布时间】:2011-12-23 19:49:31 【问题描述】:我正在尝试编写自己的字符串类(这样我可以了解更多信息),在此过程中我注意到我遇到了如何删除 char 数据的问题,当程序关闭时,将调用字符串的析构函数而且删除数据会出现堆错误
#include <string.h>
template<typename T>
class String
protected:
T* mData;
public:
String(const T* data);
~String();
;
template<typename T>
String<T>::String(const T* data)
if(data != NULL)
mData = new T[strlen(data)];
strcpy(mData, data);
template<typename T>
String<T>::~String()
if(mData != NULL)
delete [] mData;
mData = 0;
int main(void)
String<char> Test("Test");
return(0);
【问题讨论】:
删除前无需测试NULL(或将值设置为0后缀)。 你需要遵守三法则。否则你会在第一次复制后崩溃。 你说得对,我违反了三法则(我想做一个简单的测试用例) 【参考方案1】: mData = new T[strlen(data)];
strcpy(mData, data);
您分配的项目太少,strcpy 复制了 nul 终止字节以及字符串
【讨论】:
就是这样,我完全忘记了。感谢您的帮助。【参考方案2】:你应该使用“memcpy”和“memset”函数而不是像strcpy这样的函数:
http://www.cplusplus.com/reference/clibrary/cstring/memcpy/
【讨论】:
通过使用 'memcpy' 函数,您可以使用快速的内存块。 'strcpy' 也是不安全的,因为它可能导致溢出,就像你的情况一样,有一个安全的 'strlcpy' 函数。当您使用内存块功能时,您可以完全控制内存。就个人而言,我更喜欢两个字符串类,一个用于 char 类型,另一个用于 wchar_t 类型,它们都继承自同一个通用抽象类(接口)而不是使用模板(通用)。【参考方案3】:您必须小心 operator new 在您的构造函数中抛出异常。如果发生这种情况,您必须确保已将数据指针初始化为 nullptr,否则将调用析构函数并尝试删除一些随机地址。
#include <cstring>
template<typename T>
class string
protected:
T * data_;
public:
string(T const * data);
~string();
;
template<typename T>
string<T>::string(T const * data)
try
if(!data) data_ = 0;
else
data_ = new T[std::strlen(data) + 1];
std::strcpy(data_, data);
catch(...)
data_ = 0;
template<typename T>
string<T>::~string()
delete[] data_;
int main()
string<char> test("test");
return 0;
【讨论】:
以上是关于为啥我在删除 char* 时出现内存异常的主要内容,如果未能解决你的问题,请参考以下文章
使用 Android-Espresso 运行多个测试时出现内存不足异常
尝试从常量 char * 类型的指针复制数据时出现“超出内存访问”错误。为啥?