eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingDziwny wyciek zasobów › Dziwny wyciek zasobów
  • Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit
    0.net!newsreader4.netcologne.de!news.netcologne.de!peer03.ams1!peer.ams1.xlned.
    com!news.xlned.com!peer02.fr7!futter-mich.highwinds-media.com!news.highwinds-me
    dia.com!fx16.fr7.POSTED!not-for-mail
    Newsgroups: pl.comp.programming
    X-Mozilla-News-Host: snews://newshosting.com:563
    From: Szyk Cech <s...@s...pl>
    Subject: Dziwny wyciek zasobów
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101
    Thunderbird/60.5.1
    MIME-Version: 1.0
    Content-Type: text/plain; charset=utf-8; format=flowed
    Content-Language: pl-PL
    Content-Transfer-Encoding: 8bit
    Lines: 116
    Message-ID: <QUOgE.6781$WX2.6137@fx16.fr7>
    X-Complaints-To: abuse(at)newshosting.com
    NNTP-Posting-Date: Sat, 09 Mar 2019 13:08:00 UTC
    Organization: Newshosting.com - Highest quality at a great price! www.newshosting.com
    Date: Sat, 9 Mar 2019 14:08:00 +0100
    X-Received-Bytes: 4933
    X-Received-Body-CRC: 1837831376
    Xref: news-archive.icm.edu.pl pl.comp.programming:213388
    [ ukryj nagłówki ]

    Witam

    [WSTĘP]
    Mam program w C++ oparty na bibliotece Qt. Generalnie program jest
    niezależny od systemu operacyjnego. Jednak z jakichś dziwnych względów
    biblioteka Qt nie ma możliwości operowania na datach plików i katalogów.
    Dlatego napisałem funkcję w oparciu o Api Linux-a realizującą kopiowanie
    dat plików. Jest to przydatne podczas kopiowania.

    [PROBLEM]
    Mam jakiś wyciek zasobów. W pewnym momencie operacja fopen się nie udaje
    (po całkiem sporej liczbie poprawnych operacji). Wg mnie wszystko
    powinno grać, ale błąd występuje.

    [KOD]
    Oto kod mojej funkcji:

    void gCopyFileAtributes(QString aSource, QString aDest)
    {
    if(!QFileInfo::exists(aSource))
    NOTIFY_EXCEPTION(QObject::tr("Source file does not exists:
    %1").arg(aSource), gLibraryId, eErrorCode::eFileSystemError);
    if(!QFileInfo::exists(aDest))
    NOTIFY_EXCEPTION(QObject::tr("Destination file does not exists:
    %1").arg(aDest), gLibraryId, eErrorCode::eFileSystemError);

    FILE* lSrc = fopen(aSource.toUtf8(), "r");
    if(!lSrc)
    NOTIFY_EXCEPTION(QObject::tr("fopen failed for file: %1:
    %2").arg(aSource).arg(strerror(errno)), gLibraryId,
    eErrorCode::eFileSystemError);

    FILE* lDest = fopen(aDest.toUtf8(), "w");
    if(!lDest)
    {
    fclose(lSrc);
    NOTIFY_EXCEPTION(QObject::tr("fopen failed for file: %1:
    %2").arg(aDest).arg(strerror(errno)), gLibraryId,
    eErrorCode::eFileSystemError);
    }

    struct stat lStat;
    if(fstat(fileno(lSrc),&lStat))
    {
    fclose(lSrc);
    fclose(lDest);
    NOTIFY_EXCEPTION(QObject::tr("fstat failed for file: %1:
    %2").arg(aSource).arg(strerror(errno)), gLibraryId,
    eErrorCode::eFileSystemError);
    }


    // Update to the same uid/gid
    if(fchown(fileno(lDest), lStat.st_uid,lStat.st_gid))
    {
    fclose(lSrc);
    fclose(lDest);
    NOTIFY_EXCEPTION(QObject::tr("fchown failed:
    %1").arg(strerror(errno)), gLibraryId, eErrorCode::eFileSystemError);
    }

    // Update the permissions
    if(fchmod(fileno(lDest), lStat.st_mode))
    {
    fclose(lSrc);
    fclose(lDest);
    NOTIFY_EXCEPTION(QObject::tr("fchmod failed:
    %1").arg(strerror(errno)), gLibraryId, eErrorCode::eFileSystemError);
    }

    // Change access time
    timeval lTimes[2];
    lTimes[0].tv_sec = lStat.st_atim.tv_sec;
    quint32 lUsecA(static_cast<quint32>(lStat.st_atim.tv_nsec / 1000));
    lTimes[0].tv_usec = lUsecA;

    // Change modification time
    lTimes[1].tv_sec = lStat.st_mtim.tv_sec;
    quint32 lUsecM(static_cast<quint32>(lStat.st_mtim.tv_nsec / 1000));
    lTimes[1].tv_usec = lUsecM;

    if(futimes(fileno(lDest), lTimes))
    {
    fclose(lSrc);
    fclose(lDest);
    NOTIFY_EXCEPTION(QObject::tr("futimes failed:
    %1").arg(strerror(errno)), gLibraryId, eErrorCode::eFileSystemError);
    }

    fclose(lSrc);
    fclose(lDest);
    }

    [OPIS FUNCKCJI]
    Jak widać wszystko tworzone jest na stosie z wyjątkiem 2 zmiennych lSrc
    i lDest. Jednak one są zawsze zwalniane i po za tym wyjątki nie są
    zgłaszane w trakcie wcześniejszej pracy.

    [OPIS ZGŁASZANEGO BŁĘDU]
    File: ../../../../Kopia3/Src/Libs/Common/Src/FileTools.Lin
    ux.cpp, in
    line: 26, in function: gCopyFileAtributes
    Error code: 3, Error message: fopen failed for file:
    /tmp/Kopia/!-dokumenty 2019-03-09 13-17-03/Programowanie/Qt/C++ GUI
    Programming with Qt 4/qt-book/chap06/mdieditor/images/new.png: Brak dostępu
    Exception occurs! Sender: Common.so, Error code: 3
    Message:
    File: ../../../../Kopia3/Src/Libs/Common/Src/FileTools.Lin
    ux.cpp, in
    line: 26, in function: gCopyFileAtributes
    Error code: 3, Error message: fopen failed for file:
    /tmp/Kopia/!-dokumenty 2019-03-09 13-17-03/Programowanie/Qt/C++ GUI
    Programming with Qt 4/qt-book/chap06/mdieditor/images/new.png: Brak dostępu
    Bug report has been sent...

    Może ktoś doradzi jak prawidłowo powinna wyglądać ta funkcja?
    dzięki i pozdro
    Szyk Cech

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: