c++调试帮助内存泄漏

C++ Debugging Help Memory Leak

本文关键字:泄漏 内存 帮助 调试 c++      更新时间:2023-10-16

我目前正在处理一个任务,我正在努力调试我的内存泄漏。我的程序运行并通过,但是,当我上传它进行分级时,我的代码有内存泄漏。如果有人能指出我在正确的方向上如何解决它,我会非常感激!

我已经试过了我能想到的一切!
#ifndef A2_HPP
#define A2_HPP
#include <algorithm>
class sorted_sc_array {
public:
/*
 * return: none
 * constructor with no argument assign size_ = 0 and ptr_ to null pointer
 */
sorted_sc_array() : size_(0), ptr_(nullptr) {
}
/*
 * return: none
 * destructor delete the pointer ptr_
 */
~sorted_sc_array() {
    delete[] ptr_;
}
/*
 * return: none
 * when assign an object to new object
 */
sorted_sc_array(const sorted_sc_array& A){
    const signed char* str = A.data();
    int sz = A.size_;
    this->size_ = 0;
    for(int i = 0; i < sz; i++) this->insert(str[i]);
    delete[] str;
}
/*
 * return: sorted_sc_array
 * overloading of operator =
 */
sorted_sc_array& operator=(const sorted_sc_array& A){
    const signed char* str = A.data();
    int sz = A.size_;
    this->size_ = 0;
    for(int i = 0; i < sz; i++) this->insert(str[i]);
}
/*
 * return int
 * return the size of the ptr_
 */
int size() const {
    return size_;
}
/*
 * return char*
 * return the deta stored in the pointer ptr_
 */
const signed char* data() const {
    return ptr_;
}
/*
 * return void
 * add new char to the pointer ptr_ and sort the the new string after the addition
 */
void insert(signed char c) {
    signed char *str = (signed char*)malloc((size_ + 1)*sizeof(char));
    for(int i = 0; i < size_; i++) str[i] = ptr_[i];
    str[size_++] = c;
    ptr_ = (signed char*)malloc((size_)*sizeof(char));
    for(int i = 0; i < size_; i++) ptr_[i] = str[i];
    std::sort(ptr_, ptr_ + size_);
    delete[] str;
}

private:
int size_; // size of the array
signed char* ptr_; // pointer to the array
}; // class sorted_sc_array
#endif // A2_HPP

这是测试类:

/*
* File: a2.pp
* Description: testing class a2.hpp
*/
#include <iostream>
#include "a2.hpp"

int main(int argc, char* argv[]) {
sorted_sc_array A;
{
    sorted_sc_array T;
    for (signed char c = -128; c < 127; ++c) T.insert(c);
    T = T;
    sorted_sc_array V = T;
    A = V;
}
const auto first = A.data();
const auto last = first + A.size();
auto size = A.size();
bool res = std::is_sorted(first, last);
if (!res || (A.size() != 255)) std::cout << "fail";
else std::cout << "pass";
std::cout << std::endl;
return 0;
} // main

代码编译和执行,有一个"通过",但有一个内存泄漏的地方!(

显示的代码中有多个错误。

在复制构造函数中:
delete[] str;

删除另一个对象的缓冲区。当另一个对象的析构函数被销毁时,它将再次尝试delete[]自己的缓冲区。这将导致内存损坏和未定义行为。

明显的内存泄漏在您的insert():

ptr_ = (signed char*)malloc((size_)*sizeof(char));

这里同时存在两个bug。

  1. 使用malloc作为缓冲区,析构函数最终将delete[]

  2. 只有new -ed的对象可以是delete[] d,使用delete作为malloc -ed的内容是未定义的行为。
  3. ptr_之前的内容没有明确的delete d,从而导致内存泄漏。

总的来说,insert()正在进行不必要的分配。这里不需要分配两次缓冲区。只有一个分配是足够的:分配,将内容复制到新缓冲区,delete复制到旧的ptr_,并将ptr_设置为新分配的缓冲区。