为啥我在删除 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 * 类型的指针复制数据时出现“超出内存访问”错误。为啥?

使用 OpenCV (2.4.5) 时出现内存异常

为啥我在使用 java.util.zip.ZipFile 打开空 ZIP 文件时出现异常?

J2me 应用程序在多个时间文件播放时出现内存不足异常

使用 EPPlus 库从 SQL Server 导出到 Excel 时出现“内存不足”异常