【发布时间】:2020-02-25 01:14:43
【问题描述】:
我有一个任务,我需要使用重载的析构函数来删除动态分配的指针。但是,当它运行时,我的一些指针被删除,直到我的一个对象的指针出现分段错误,一个指向“和第二个”,使用参数化构造函数。 我试图通过并确保删除运算符有括号(因为我的新运算符有)我通过打印出它的信息和地址来确保该对象仍然存在。我试图重写我的分配函数,并且我试图检查我的析构函数以查看它在哪里搞砸了。 如果有帮助,我已经包含了我的析构函数、分配函数、解除分配函数和参数化构造函数。
'''
//Destructor
MyString::~MyString()
{
buffer_deallocate();
};
void MyString::buffer_deallocate() {
cout << m_buffer << endl;
delete[](m_buffer);
m_buffer = NULL;
m_size = 0;
}
void MyString::buffer_allocate(size_t size) {
try {
m_buffer = new char[size];
m_size = size;
}
catch(bad_alloc&)
{
cout << "Errror: Unable to allocate memory" << endl;
buffer_deallocate();
}
}
//Parameterized Constructor
MyString::MyString(const char * str)
:m_size(0)
{
const char * strPtr = str;
while(*strPtr)
{
strPtr++;
m_size++;
}
buffer_allocate(m_size);
for(int i = 0; i < m_size; i++)
{
m_buffer[i] = str[i];
}
};
'''
然而,每次我得到“和第二个”之后的输出 分段错误(核心转储)
编辑:我已经尝试了大部分推荐的方法。至少我的理解是,问题仍然存在,我现在意识到我的代码有点稀疏。 (请见谅,我还在学习。)以下是新代码以及函数文件的其余部分供参考:
'''
#include<iostream>
#include<string.h>
using namespace std;
#include"MyString.h"
//Default Constructor
MyString::MyString()
:m_size(0), m_buffer(NULL)
{
buffer_allocate(0);
};
//Parameterized Constructor
MyString::MyString(const char * str)
:m_size(strlen(str)+1), m_buffer(NULL)
{
buffer_allocate(m_size);
strncpy(m_buffer, str, m_size);
};
//Copy Constructor
MyString::MyString(const MyString & other)
:m_size(0), m_buffer(NULL)
{
const char * otherPtr = other.c_str();
buffer_allocate(other.size());
for(int i = 0; i < size(); i++)
{
m_buffer[i] = otherPtr[i];
}
m_buffer[m_size] = '\0';
};
//Destructor
MyString::~MyString()
{
buffer_deallocate();
};
size_t MyString::size() const
{
return m_size;
}
size_t MyString::length() const{
return m_size-1;
}
const char * MyString::c_str() const{
return m_buffer;
}
bool MyString::operator==(const MyString & other) const {
char * m_bufferPointer = m_buffer;
while(*m_bufferPointer++)
{
const char * str_ptr = other.c_str();
if(*m_buffer != *str_ptr++)
{
return 0;
}
}
return 1;
}
MyString & MyString::operator=(const MyString & rhs) {
buffer_deallocate();
buffer_allocate(rhs.size());
const char * c_strPtr = rhs.c_str();
int i;
for(i = 0; i < rhs.size(); i++)
{
this->m_buffer[i] = c_strPtr[i];
}
return *this;
}
MyString MyString::operator+ (const MyString & other_myStr) const {
char * temp_pointer;
temp_pointer;
size_t temp_size = m_size + other_myStr.size();
//New Combined Buffer for Concatanation
try {
temp_pointer = new char[temp_size];
temp_pointer = strcat(this->m_buffer, other_myStr.c_str());
}
catch(bad_alloc&)
{
cout << "Error: Unable to Allocate Memory";
return NULL;
}
return MyString(temp_pointer);
}
char & MyString:: operator[](size_t index) {
return m_buffer[index];
}
const char & MyString::operator[] (size_t index) const {
return m_buffer[index];
}
ostream & operator << (ostream& os, const MyString & myStr) {
os << myStr.m_buffer;
return os;
}
void MyString::buffer_deallocate() {
cout << "Trying to delete : " <<m_buffer << endl;
if(m_buffer){
delete[](m_buffer);
}
cout << " Success" <<endl;
m_buffer = NULL;
m_size = 0;
}
void MyString::buffer_allocate(size_t size) {
try {
m_buffer = new char[size];
m_size = size;
}
catch(bad_alloc&)
{
cout << "Errror: Unable to allocate memory" << endl;
m_size = 0;
}
}
'''
【问题讨论】:
-
buffer_allocate并不是捕捉异常然后返回void的好地方。该程序将继续愉快地认为存储已分配,因为没有人告诉它做任何其他事情。打印到屏幕上的错误消息仅在程序尝试访问空指针但失败后对用户有用。 -
你在关注rule of 3/5/0吗?
-
while(*strPtr)循环实际上是strlen。无需在这里重新发明轮子。 -
在
buffer_allocate中要注意的另一件事:如果m_buffer已经指向分配怎么办? -
复制构造函数实现了吗?是否实现了赋值运算符?如果未实施,它们是否被明确删除?
标签: c++ segmentation-fault dynamic-memory-allocation delete-operator