2016-10-09 2 views
0

В настоящее время я работаю над заданием, и я очень сильно борюсь с отладкой утечки памяти. Моя программа запускается и проходит, однако, когда я загружаю ее для классификации моего кода, происходит утечка памяти. Если бы кто-то мог указать мне в правильном направлении, как это исправить, я бы очень признателен!C++ Debugging Help Memory Leak

Я пробовал все, что мог придумать!

#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 

код компилирует и выполняет с «проход», однако есть утечка памяти где-то! :(

+0

Используйте программу valgrind, которая обнаруживает утечки памяти в других программах. –

+0

Вам нужно точно указать, какую ошибку вы получите. Я не сразу вижу утечку памяти, но вижу очевидную двойную свободу. На самом деле, я вижу утечку памяти ... –

+0

Я не получаю никаких ошибок. Мой код компилируется и запускается, однако, когда я загружаю его в класс, грейдер показывает утечку памяти. – Jay

ответ

1

Есть несколько ошибок в показанном коде

В конструктор копирования:.

delete[] str; 

Это удаляет буфер другого объекта деструктор другого объекта будет пытаться delete[] свой собственный буфер снова. ., когда он разрушается Это приведет к повреждению памяти, и непредсказуемое поведение

Очевидная утечка памяти в вашем insert():.

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

Здесь есть две ошибки.

  1. Использование malloc буфера, деструктор в конечном счете delete[]. Только new -ed объекты могут быть delete[] d. Использование delete для содержимого malloc - это неопределенное поведение.

  2. Предыдущее содержимое ptr_ не указано явно delete d, что приводит к утечке памяти.

insert(), в целом, не требует выделения. Там нет необходимости выделять буфер дважды. Достаточно только одного выделения: выделить, скопировать содержимое в новый буфер, delete старый ptr_ и установить ptr_ в недавно выделенный буфер.