C++ 调试帮助内存泄漏

标签 c++ debugging memory-leaks

我目前正在做一项作业,我正在努力调试我的内存泄漏。我的程序运行并通过了,但是,当我上传它进行评分时,我的代码发生了内存泄漏。如果有人能指出我正确的修复方法,我将不胜感激!

我已经尝试了所有我能想到的!

#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));

这里同时存在两个错误。

  1. 使用 malloc对于析构函数最终将 delete[] 的缓冲区.只有new -ed 对象可以是 delete[] d.使用 delete对于 malloc -ed 内容是未定义的行为。

  2. ptr_的先前内容没有明确 delete d,从而泄漏内存。

insert() ,总的来说,就是在做不必要的分配。那里不需要两次分配缓冲区。只有一次分配就足够了:分配,将内容复制到新缓冲区,deleteptr_ , 并设置 ptr_到新分配的缓冲区。

关于C++ 调试帮助内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39939248/

相关文章:

c++ - 使用计时器和信号而不是 sleep c/c++

debugging - 如何将 Go 从 1.10 降级到 1.9?

ios - 如何解决关于 UID 1 符号中 N_SO 的 LLDB 错误

java - Activity 占用 140mb 内存

c++ - 将指针留在函数中会导致内存泄漏吗?

C++ - 创建安全的 const char* 构造函数

c++ - Mac OS X。Lua 框架没有这样的文件或目录

c++ - 可以将原始指针传递给需要迭代器的模板函数吗?

c++ - 为什么这个输出看起来不确定? (是 sprintf、printf 还是十六进制文字的语法?)

c++ - 在 C++ 中设计多维数组