在这种情况下,我应该删除指针吗?
Should I delete the pointer in this case?
在我自己的字符串类中(只是为了学习),我重载了操作符+是否需要清理tmpPtr
所指向的内存?
String String::operator+(const String& rv) const
{
size_t newLength = length + rv.length;
char* tmpPtr = new char[newLength + 1];
strcpy(tmpPtr, ptr);
strcpy(tmpPtr + length, rv.ptr);
String S(tmpPtr);
delete[] tmpPtr;
return S;
}
我可以这样改变这个方法吗?
String String::operator+(const String& rv) const
{
size_t newLength = length + rv.length;
char* tmpPtr = new char[newLength + 1];
strcpy(tmpPtr, ptr);
strcpy(tmpPtr + length, rv.ptr);
return S(tmpPtr);
}
如果需要构造函数和析构函数:
String::String(const char* str)
{
setString(str, strlen(str));
}
String::String(const String& str)
{
setString(str.ptr, str.length);
}
void String::setString(const char* str, size_t size)
{
ptr = new char[size + 1];
strcpy(ptr, str);
length = size;
}
String::~String()
{
delete[] ptr;
}
正如Vlad所说,这取决于您如何实现构造函数。
如果构造函数只是获取指针的所有权,然后在析构函数中删除它,那么这里不需要delete[]
。然而,这是有问题的,因为这意味着你不能安全地从字符串字面量直接构造一个String
实例。
String
的内存使用是对称的:它释放它分配的所有内存,而不释放其他内存。这意味着,如果你new[]
某样东西,然后将该指针传递给String
的构造函数,你仍然需要delete[]
它。然而,无论哪种方式,这两种选择都不是特别适合这里。相反,您应该这样做:
String String::operator+(const String& rv) const
{
size_t newLength = length + rv.length;
// Create a string with enough backing storage
String S(newLength + 1);
strcpy(S.ptr, ptr);
strcpy(S.Ptr + length, rv.ptr);
return S;
}
这确保是String
实例管理所涉及的内存,因此您可以获得通常从构造函数/析构函数对获得的所有清理保证。
Edit:有了构造函数体,我们可以得出结论,您采用了第二种方法。因此,如果您继续使用这种方法,则需要对内存进行delete[]
。
由于构造函数String::String
调用的String::setString
成员函数在动态内存中创建了自己的char数组,并复制了传入字符串的内容:
void String::setString(const char* str, size_t size)
{
ptr = new char[size + 1];
strcpy(ptr, str);
length = size;
}
原来在String::operator+
中创建的内存不再需要,它被存储在任何地方,因此如果不删除就会泄漏。所以,是的,你需要delete[]
是。一般来说,您需要删除由new
分配的内存。
在c++编程语言中,
delete
操作符调用给定实参的析构函数,并将new
分配的内存返回给堆。[1]每次调用new
都必须调用delete
,以避免内存泄漏。
c++ 11.3.8对象生存期(p4):
…如果没有显式调用析构函数,或者没有使用delete表达式(5.3.5)来释放存储,则不应隐式调用析构函数,并且任何依赖析构函数产生的副作用的程序都具有未定义的行为。
EDIT:根据OP的编辑,由于析构函数正在释放内存,在这种情况下不需要显式地删除ptr
。但仍然需要使用delete[]
运算符删除tmpPtr
- 使用函数引用指向节点的指针删除链表中的节点?
- 如何通过指向元组的共享指针删除对象
- 函数内的 C++ 指针删除
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何通过存储在 std::list 中的指针删除对象?
- C++中的智能指针删除
- 将C 中的每个指针删除作为阵列的指针安全吗?
- 使用 C 字符串和指针.删除除小写和空格以外的任何字符
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 提升属性树:使用指向节点及其父节点的指针删除节点
- 警告C4150在尝试包装本机C 类时,指向不完整类型的指针删除
- C++ Valgrind 双指针删除,用于防止内存泄漏
- C 通过指向其基类的指针删除派生对象
- 将指针删除到数组
- 当通过其中一个指针删除对象时,C++将所有指针设置为null
- 智能指针删除器和"using"名称为"pointer"关键字
- 通过指向其基的指针删除 POD 对象是否安全
- 模板化的出列无效指针:删除类时失败
- 使用"this"指针删除
- (C++) list.error 方法和使用指针删除内存