<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Destruktor wird scheinbar grundlos aufgerufen]]></title><description><![CDATA[<p>Moin moin</p>
<p>In meinem aktuellen Projekt hat sich grad ein für mich nicht erkennbarer Fehler eingeschlichen, und zwar wird ein Destruktor ohne delete oder ähnliches aufgerufen (aus einer anderen Klasse heraus)</p>
<p>betroffene Funktion:</p>
<pre><code class="language-cpp">int CPatching::loadPatchingFile(string path){
    //filenamen erzeugen
    string patchPath = path + &quot;\\Patch.ptch&quot;;
    string ficturePath = path + &quot;\\Fictures.fict&quot;;

    int returnValue = 0;

    //kopieren
    char * patchPathChar = new char[patchPath.size()+1];
    char * ficturePathChar = new char[ficturePath.size()+1];
    strcpy(patchPathChar, patchPath.c_str());
    strcpy(ficturePathChar, ficturePath.c_str());

    patchSave myPatchSaveFile;

    //Patchinfos laden
    ifstream fin(patchPathChar, ios::in | ios::binary);
    if (fin.is_open()){
        fin.read((char*) &amp;myPatchSaveFile, sizeof(patchSave));

        //Dimmer-Infos kopieren
        for (int i=0; i&lt;NDIMCHANNELS; i++){
            this-&gt;dimCh[i] = myPatchSaveFile.dimCh[i];
            this-&gt;dimChAlias[i] = myPatchSaveFile.dimChAlias[i];
        }
        //Ficture-Infos kopieren
        for (int i=0; i&lt;NFICTURES; i++){
            this-&gt;fictureAlias[i] = myPatchSaveFile.fictureAlias[i];
        }

        for (int i=0; i&lt;512; i++)
            this-&gt;available[i] = myPatchSaveFile.available[i];
    }
    else
    {
        returnValue -= 1;
    }

    CFicture aFicture;

    //alle gespeicherten Fictures laden
    fin.close();
    if (returnValue == 0){
        fin.open(ficturePathChar, ios::in | ios::binary);
        if (fin.is_open()){
            for (int i=0; i&lt;NFICTURES; i++){
                if (myPatchSaveFile.ficturesUsed[i]){
                    fin.read((char*) &amp;aFicture, sizeof(CFicture));
                    if (fictures[i] != NULL)
                        delete fictures[i];
                    fictures[i] = new CFicture(aFicture);
                }
                else{
                    if (fictures[i] != NULL)
                        delete fictures[i];
                    fictures[i] = NULL;
                }
            }
        }
        else
            returnValue -= 2;
    }

    delete [] patchPathChar;
    delete [] ficturePathChar;

    return returnValue;
}
</code></pre>
<p>Am Ende dieser Funktion wird der Destruktor von CFicture aufgerufen.</p>
<pre><code class="language-cpp">CFicture::~CFicture(){
    if (nullOutputValue!=NULL)
        delete nullOutputValue;
}
</code></pre>
<p>Also etwas genauer: Wenn ich mit dem Debuger bei</p>
<pre><code class="language-cpp">return returnValue
</code></pre>
<p>angekommen bin, springt das Programm zu Destruktor von CFicture.</p>
<p>Hier noch das Headerfile von CPatching (falls es benötigt werden sollte:</p>
<pre><code class="language-cpp">#ifndef CPATCHING_H
#define CPATCHING_H

#include &lt;string&gt;
#include &lt;vector&gt;
using namespace std;

//CONST
const short NFICTURES = 60;
const short NDIMCHANNELS = 120;

//forward declaration
class CFicture;
class CDMX;
class CCue;
class CMemory;
class CChaser;
class CPreset;

struct patchSave{
    bool ficturesUsed[NFICTURES];
    int dimCh[NDIMCHANNELS];

    bool available[512];
    char fictureAlias[NFICTURES][128];
    char dimChAlias[NDIMCHANNELS][128];
};

/**
 * @brief Diese Klasse managed das ganze Patching, also wo welches Ficture, welcher Dimmerkanal ist (bzw. welche Adresse es/er hat)
 *\details Im Prinzip besteht CPatching aus einem Array von Pointern auf CFicture, um somit Zugriff auf diese zu erhalten.
 *Ausserdem kontrolliert sie auch alle Dimmerkanaele.
 */
class CPatching{
public:
    CPatching();
    ~CPatching();

    //playback
    void playMemory(CMemory* memory, int fade = 100);
    void playChaser(CChaser* chaser, int fade = 100);
    void playPreset(CPreset* preset);

    void stopMemory(CMemory* memory);

    //INPUT
    //originaler Input
    void origDimChChange(int dimCh, int value);
    void origGroupChange(int ficture, int attribute, int value);

    //cue Input
    void realDimChChange(int dimCh, int value);

    //PATCHING

    //channels available?
    bool channelsAvailable(int startAdress, int count = 1, int offset = 1, int channels = 1);
    void refreshChannelsAvailable();

    //ficture patch
    CFicture * newFicture(const short ficture);
    int deleteFicture(const short ficture);

    CFicture * getFicture(const short ficture) {return this-&gt;fictures[ficture];}
    CFicture ** getFictures(){return this-&gt;fictures;}

    //dim patch
    int getDimCh(const int channel){return this-&gt;dimCh[channel];}
    int* getDimCh(){return this-&gt;dimCh;}

    void setDimCh(int patchCh, int DmxCh){this-&gt;dimCh[patchCh] = DmxCh;}
    void deleteDimCh(int channel){this-&gt;dimCh[channel] = -1;}

    //aliase
    void setFictureAlias(string alias, int ficture);
    string getFictureAlias(int ficture);
    string* getFictureAlias();

    void setDimChAlias(string alias, int channel);
    string getDimChAlias(int channel){return this-&gt;dimChAlias[channel];}
    string* getDimChAlias(){return this-&gt;dimChAlias;}

    //DMX
    int getDmxStatus() {return dmxStatus;}  

    //LOAD &amp; SAVE
    int savePatchingFile(string path);
    int loadPatchingFile(string path);

    //SONSTIGES
    //get values
    void getDimChValues(int (&amp;values)[NDIMCHANNELS]);

private:    
    //dim input
    void setDimChValue(int dimCh, int value);

    //hilfsfunktionen
    int valueInRange(int value);

    CFicture **fictures;
    int dimCh[NDIMCHANNELS];

    //originaler Output - ohne Cues
    short origDimChValues[NDIMCHANNELS];
    short origFictureHtpValues[NFICTURES];

    //realer Output - mit Cues
    short realDimChValues[NDIMCHANNELS];
    short realFictureHtpValues[NFICTURES];

    //aktive Cues
    vector&lt;CCue *&gt; activeCues;
    short cueControlledDimChs[NDIMCHANNELS];
    short cueControlledFictures[NDIMCHANNELS];

    //dmxout
    CDMX *dmxOut;
    int dmxStatus;

    bool available[512];
    string fictureAlias[NFICTURES];
    string dimChAlias[NDIMCHANNELS];
};

#endif //CPATCHING_H
</code></pre>
<p>Ich habe jetzt den Nachmittag damit verbracht, zu versuchen, herauszubekommen, wieso der Destruktor aufgerufen wird, leider bis jetzt ohne Ergebnis :S<br />
Danke schonmal für die Hilfe, falls ihr noch weiteren Sourcecode benötigen solltet sagt Bescheid.</p>
<p>PS: IDE ist QT, compiliert wird das ganze mit MinGW, falls das von Belang sein sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/299344/destruktor-wird-scheinbar-grundlos-aufgerufen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 08:53:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/299344.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 08 Feb 2012 19:56:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 19:56:05 GMT]]></title><description><![CDATA[<p>Moin moin</p>
<p>In meinem aktuellen Projekt hat sich grad ein für mich nicht erkennbarer Fehler eingeschlichen, und zwar wird ein Destruktor ohne delete oder ähnliches aufgerufen (aus einer anderen Klasse heraus)</p>
<p>betroffene Funktion:</p>
<pre><code class="language-cpp">int CPatching::loadPatchingFile(string path){
    //filenamen erzeugen
    string patchPath = path + &quot;\\Patch.ptch&quot;;
    string ficturePath = path + &quot;\\Fictures.fict&quot;;

    int returnValue = 0;

    //kopieren
    char * patchPathChar = new char[patchPath.size()+1];
    char * ficturePathChar = new char[ficturePath.size()+1];
    strcpy(patchPathChar, patchPath.c_str());
    strcpy(ficturePathChar, ficturePath.c_str());

    patchSave myPatchSaveFile;

    //Patchinfos laden
    ifstream fin(patchPathChar, ios::in | ios::binary);
    if (fin.is_open()){
        fin.read((char*) &amp;myPatchSaveFile, sizeof(patchSave));

        //Dimmer-Infos kopieren
        for (int i=0; i&lt;NDIMCHANNELS; i++){
            this-&gt;dimCh[i] = myPatchSaveFile.dimCh[i];
            this-&gt;dimChAlias[i] = myPatchSaveFile.dimChAlias[i];
        }
        //Ficture-Infos kopieren
        for (int i=0; i&lt;NFICTURES; i++){
            this-&gt;fictureAlias[i] = myPatchSaveFile.fictureAlias[i];
        }

        for (int i=0; i&lt;512; i++)
            this-&gt;available[i] = myPatchSaveFile.available[i];
    }
    else
    {
        returnValue -= 1;
    }

    CFicture aFicture;

    //alle gespeicherten Fictures laden
    fin.close();
    if (returnValue == 0){
        fin.open(ficturePathChar, ios::in | ios::binary);
        if (fin.is_open()){
            for (int i=0; i&lt;NFICTURES; i++){
                if (myPatchSaveFile.ficturesUsed[i]){
                    fin.read((char*) &amp;aFicture, sizeof(CFicture));
                    if (fictures[i] != NULL)
                        delete fictures[i];
                    fictures[i] = new CFicture(aFicture);
                }
                else{
                    if (fictures[i] != NULL)
                        delete fictures[i];
                    fictures[i] = NULL;
                }
            }
        }
        else
            returnValue -= 2;
    }

    delete [] patchPathChar;
    delete [] ficturePathChar;

    return returnValue;
}
</code></pre>
<p>Am Ende dieser Funktion wird der Destruktor von CFicture aufgerufen.</p>
<pre><code class="language-cpp">CFicture::~CFicture(){
    if (nullOutputValue!=NULL)
        delete nullOutputValue;
}
</code></pre>
<p>Also etwas genauer: Wenn ich mit dem Debuger bei</p>
<pre><code class="language-cpp">return returnValue
</code></pre>
<p>angekommen bin, springt das Programm zu Destruktor von CFicture.</p>
<p>Hier noch das Headerfile von CPatching (falls es benötigt werden sollte:</p>
<pre><code class="language-cpp">#ifndef CPATCHING_H
#define CPATCHING_H

#include &lt;string&gt;
#include &lt;vector&gt;
using namespace std;

//CONST
const short NFICTURES = 60;
const short NDIMCHANNELS = 120;

//forward declaration
class CFicture;
class CDMX;
class CCue;
class CMemory;
class CChaser;
class CPreset;

struct patchSave{
    bool ficturesUsed[NFICTURES];
    int dimCh[NDIMCHANNELS];

    bool available[512];
    char fictureAlias[NFICTURES][128];
    char dimChAlias[NDIMCHANNELS][128];
};

/**
 * @brief Diese Klasse managed das ganze Patching, also wo welches Ficture, welcher Dimmerkanal ist (bzw. welche Adresse es/er hat)
 *\details Im Prinzip besteht CPatching aus einem Array von Pointern auf CFicture, um somit Zugriff auf diese zu erhalten.
 *Ausserdem kontrolliert sie auch alle Dimmerkanaele.
 */
class CPatching{
public:
    CPatching();
    ~CPatching();

    //playback
    void playMemory(CMemory* memory, int fade = 100);
    void playChaser(CChaser* chaser, int fade = 100);
    void playPreset(CPreset* preset);

    void stopMemory(CMemory* memory);

    //INPUT
    //originaler Input
    void origDimChChange(int dimCh, int value);
    void origGroupChange(int ficture, int attribute, int value);

    //cue Input
    void realDimChChange(int dimCh, int value);

    //PATCHING

    //channels available?
    bool channelsAvailable(int startAdress, int count = 1, int offset = 1, int channels = 1);
    void refreshChannelsAvailable();

    //ficture patch
    CFicture * newFicture(const short ficture);
    int deleteFicture(const short ficture);

    CFicture * getFicture(const short ficture) {return this-&gt;fictures[ficture];}
    CFicture ** getFictures(){return this-&gt;fictures;}

    //dim patch
    int getDimCh(const int channel){return this-&gt;dimCh[channel];}
    int* getDimCh(){return this-&gt;dimCh;}

    void setDimCh(int patchCh, int DmxCh){this-&gt;dimCh[patchCh] = DmxCh;}
    void deleteDimCh(int channel){this-&gt;dimCh[channel] = -1;}

    //aliase
    void setFictureAlias(string alias, int ficture);
    string getFictureAlias(int ficture);
    string* getFictureAlias();

    void setDimChAlias(string alias, int channel);
    string getDimChAlias(int channel){return this-&gt;dimChAlias[channel];}
    string* getDimChAlias(){return this-&gt;dimChAlias;}

    //DMX
    int getDmxStatus() {return dmxStatus;}  

    //LOAD &amp; SAVE
    int savePatchingFile(string path);
    int loadPatchingFile(string path);

    //SONSTIGES
    //get values
    void getDimChValues(int (&amp;values)[NDIMCHANNELS]);

private:    
    //dim input
    void setDimChValue(int dimCh, int value);

    //hilfsfunktionen
    int valueInRange(int value);

    CFicture **fictures;
    int dimCh[NDIMCHANNELS];

    //originaler Output - ohne Cues
    short origDimChValues[NDIMCHANNELS];
    short origFictureHtpValues[NFICTURES];

    //realer Output - mit Cues
    short realDimChValues[NDIMCHANNELS];
    short realFictureHtpValues[NFICTURES];

    //aktive Cues
    vector&lt;CCue *&gt; activeCues;
    short cueControlledDimChs[NDIMCHANNELS];
    short cueControlledFictures[NDIMCHANNELS];

    //dmxout
    CDMX *dmxOut;
    int dmxStatus;

    bool available[512];
    string fictureAlias[NFICTURES];
    string dimChAlias[NDIMCHANNELS];
};

#endif //CPATCHING_H
</code></pre>
<p>Ich habe jetzt den Nachmittag damit verbracht, zu versuchen, herauszubekommen, wieso der Destruktor aufgerufen wird, leider bis jetzt ohne Ergebnis :S<br />
Danke schonmal für die Hilfe, falls ihr noch weiteren Sourcecode benötigen solltet sagt Bescheid.</p>
<p>PS: IDE ist QT, compiliert wird das ganze mit MinGW, falls das von Belang sein sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178668</guid><dc:creator><![CDATA[Jeremin]]></dc:creator><pubDate>Wed, 08 Feb 2012 19:56:05 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 20:01:41 GMT]]></title><description><![CDATA[<p>Das ist dann wohl die lokale Variable</p>
<pre><code class="language-cpp">CFicture aFicture;
</code></pre>
<p>, die am Ende der Funktion zerstört wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178673</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 08 Feb 2012 20:01:41 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 20:01:11 GMT]]></title><description><![CDATA[<p>Das ist ein Stack Objekt und der Destuktor wird aufgerufen, wenns out of scope läuft. Probier nicht rum, lern einfach C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178675</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Wed, 08 Feb 2012 20:01:11 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 20:01:50 GMT]]></title><description><![CDATA[<p>Ein Destruktor wird immer dann aufgerufen, wenn ein Objekt zerstört wird. Mit delete lässt sich ein Objekt zerstören, das mit new angefordert wurde. Sobald ein Objekt aber seinen scope verlässt, wird es automatisch zerstört.</p>
<pre><code class="language-cpp">CFicture aFicture;

//snip
return returnValue; //Funktion wird verlassen, aFicture wird zerstört-&gt; Destruktoraufruf!
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2178676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178676</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Wed, 08 Feb 2012 20:01:50 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 20:10:53 GMT]]></title><description><![CDATA[<p>Da hab ich vor lauter Bäumen den Wald wohl nicht mehr gesehen, danke euch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<blockquote>
<p>Probier nicht rum, lern einfach C++.</p>
</blockquote>
<p>Was denkst du, wozu mach das Ganze?</p>
<p>Gruss<br />
jeremin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178682</guid><dc:creator><![CDATA[Jeremin]]></dc:creator><pubDate>Wed, 08 Feb 2012 20:10:53 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 20:34:49 GMT]]></title><description><![CDATA[<p>Darf man fragen mit welchem Buch du lernst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178688</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 08 Feb 2012 20:34:49 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 20:39:19 GMT]]></title><description><![CDATA[<p>Jeremin schrieb:</p>
<blockquote>
<blockquote>
<p>Probier nicht rum, lern einfach C++.</p>
</blockquote>
<p>Was denkst du, wozu mach das Ganze?</p>
</blockquote>
<p>Learning by doing hilft in der Phase nicht so viel, zumindest bei C++. Das muss man einfach wissen. Und bevor du nicht ein Grundlagenbuch (oder Tutorial oder was auch immer) durchgearbeitet hast, wirst du die ganze Zeit Probleme haben, die du nicht verstehst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178689</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Wed, 08 Feb 2012 20:39:19 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 20:57:28 GMT]]></title><description><![CDATA[<p>Ich versteh das Problem ja durchaus, ich hab nur übersehen, dass ich eine lokale Instanz von CFicture erzeugt habe. Es ist mir durchaus bewusst, dass der Destruktor nach dem Verlassen der Funktion aufgerufen wird, jetzt da ich die Ursache kenne.</p>
<p>Wobei das Problem evt. an meinem Programmierstil liegen könnte (obwohl ich versuche den zu bessern). Falls du den kritisieren möchtest, ich bitte darum <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Aber ich bin ziemlich sicher, dass auch Leuten, die Tag täglich mit C++ zu tun haben noch Flüchtigkeitsfehler unterlaufen, wenn auch deutlich weniger häufig als mir.</p>
<p>Gruss<br />
Jeremin</p>
<p>PS: Buch ist C++ Primer Plus, wobei dieses Projekt eher der Vertiefung des Gelernten dient.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178694</guid><dc:creator><![CDATA[Jeremin]]></dc:creator><pubDate>Wed, 08 Feb 2012 20:57:28 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 21:05:59 GMT]]></title><description><![CDATA[<p>Jeremin schrieb:</p>
<blockquote>
<p>Wobei das Problem evt. an meinem Programmierstil liegen könnte (obwohl ich versuche den zu bessern). Falls du den kritisieren möchtest, ich bitte darum <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Nee, da hab ich eigentlich nichts besonderes zu kritisieren. Außer vielleicht dass man Parameter möglichst als konstante Referenzen übergeben sollte. Das Programm ist viel zu klein, um irgendwelche Aussageb über den Stil machen zu können.<br />
Du brauchst dir meine Kritik nicht so zu Herzen nehmen. Der Fehler war nur offensichtlich und deswegen hab ich gedacht, dir ist nicht klar, wie Stack Objekte funktionieren. Wenn das nicht der Fall ist, ist ja alles in Ordnung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178697</guid><dc:creator><![CDATA[Mechanics]]></dc:creator><pubDate>Wed, 08 Feb 2012 21:05:59 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 21:43:03 GMT]]></title><description><![CDATA[<p>Jeremin schrieb:</p>
<blockquote>
<p>Wobei das Problem evt. an meinem Programmierstil liegen könnte (obwohl ich versuche den zu bessern). Falls du den kritisieren möchtest, ich bitte darum <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Warum kopierst du die Pfade mit strcpy? Du hast doch schon patchPath.c_str() entdeckt, das kannst du auch direkt benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178706</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 08 Feb 2012 21:43:03 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 21:43:49 GMT]]></title><description><![CDATA[<p>Hm, ein paar Gedanken zu dem code:<br />
Warum verwendest du char*?</p>
<pre><code class="language-cpp">ifstream fin(patchPath.c_str(), ios::in | ios::binary);
</code></pre>
<p>geht doch genauso. Spart dir das new/delete.</p>
<pre><code class="language-cpp">fin.read((char*) &amp;myPatchSaveFile, sizeof(patchSave));
</code></pre>
<p>(char*) als C-style cast bin ich nicht unbedingt ein fan von. Besser reinterpret_cast&lt;char*&gt;()</p>
<p>Als letztes kannst du dir noch überlegen (auch wenn man da geteilter Meinung sein kann) ob du deine Funktion nicht in 2 Teile teilen willst. Prinzipiell lädst du ja einmal das patch file, und einmal fictures, auch wenn das etwas zusammenhängt.</p>
<p>Ich meine damit in etwa sowas:</p>
<pre><code class="language-cpp">patchSave LoadPatchFile(string path)
{
path+=&quot;\\Patch.ptch&quot;;
patchSave myPatchSaveFile;

    //Patchinfos laden
    ifstream fin(path.c_str(), ios::in | ios::binary);
    if (fin.is_open()){
        fin.read((char*) &amp;myPatchSaveFile, sizeof(patchSave));

        //Dimmer-Infos kopieren
        for (int i=0; i&lt;NDIMCHANNELS; i++){
            this-&gt;dimCh[i] = myPatchSaveFile.dimCh[i];
            this-&gt;dimChAlias[i] = myPatchSaveFile.dimChAlias[i];
        }
        //Ficture-Infos kopieren
        for (int i=0; i&lt;NFICTURES; i++){
            this-&gt;fictureAlias[i] = myPatchSaveFile.fictureAlias[i];
        }

        for (int i=0; i&lt;512; i++)
            this-&gt;available[i] = myPatchSaveFile.available[i];
    }
    else
    {

       // returnValue -= 1;
       //Das geht so natürlich nicht mehr, ich würde hier eine exception werfen
    }
return myPatchSaveFile;

}

void LoadFictures(string path, const patchSave&amp; myPatchSaveFile)
{
    path += &quot;\\Fictures.fict&quot;;
    CFicture aFicture;

    //alle gespeicherten Fictures laden
    ifstream fin(path.c_str(), ios::in | ios::binary);
    if (fin.is_open()){
        for (int i=0; i&lt;NFICTURES; i++){
            if (myPatchSaveFile.ficturesUsed[i]){
                fin.read((char*) &amp;aFicture, sizeof(CFicture));
                if (fictures[i] != NULL)
                    delete fictures[i];
                fictures[i] = new CFicture(aFicture);
            }
            else{
                if (fictures[i] != NULL)
                    delete fictures[i];
                fictures[i] = NULL;
            }
        }
    }
    else
            //returnValue -= 2;
            //das würde hier zwar gehen, aber ich würde trotzdem eine exception bevorzugen
}

void CPatching::loadPatchingFile(string path){
   //falls du excepctions wirfst kannst du sie entweder hier fangen und als errorcode zurückgeben, oder gleich weiterfliegen lassen - soll sich doch der aufrufer drum kümmern. Wenn LoadPatchFile wirft, wird LoadFictures auch nicht ausgeführt, darauf muss man also nicht prüfen
   patchSave myPatchFile = LoadPatchFile(path);
   LoadFictures(path, myPatchFile);
}
</code></pre>
<p>Weiter würd ich den returnValue nicht mit -= zuweisen, da muss man sich ja immer den ganzen code anschaun, nur um zu wissen, was tatsächlich zurückgegeben wird. Besser direkt zuweisen - wenns geht.</p>
<p>Soll nur ein Anreiz zum nachdenken sein, gibt hier sicher 50 Leute die vorallem so ne Aufteilung für total dumm halten. :&gt; Ich mags, weil es die einzelnen Aufgaben im code klarer darstellt. Andere sehen das sicher anders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178707</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Wed, 08 Feb 2012 21:43:49 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 21:49:14 GMT]]></title><description><![CDATA[<p>Sehe ich auch so mit der Aufteilung. Der nächste wichtige Schritt ist dann, aus CFicture **fictures ein vector&lt;CFicture&gt; fictures zu machen, sodass man die ganzen news und deletes los wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178710</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 08 Feb 2012 21:49:14 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 22:36:40 GMT]]></title><description><![CDATA[<p>Gute Frage wieso ich char* verwende, ich glaube, ursprünglich habe ich es mit .c_str() gemacht, doch dann hab ich das aus irgendeinem Grund geändert (mal schauen, vielleicht finde ich raus, wieso).</p>
<pre><code class="language-cpp">fin.read((char*) &amp;myPatchSaveFile, sizeof(patchSave));
</code></pre>
<p>Wir hatten das in der C++ Übungen so gelöst, daher ging ich davon aus, dass das ein vernünftiger Weg sei. Um reinterpret_cast habe ich bis jetzt einen Bogen gemacht, da dieser ja nicht ganz ungefährlich sei.</p>
<p>Die Aufteilung würde Sinn machen, dass baue ich in nächster Zeit um. Genauso mit exeptions, die sind eigentlich schon länger geplant, bin aber noch nicht dazu gekommen.</p>
<blockquote>
<p>Der nächste wichtige Schritt ist dann, aus CFicture **fictures ein vector&lt;CFicture&gt; fictures zu machen, sodass man die ganzen news und deletes los wird.</p>
</blockquote>
<p>Das Problem hierbei ist, dass ich explizit auf Fictures zugreifen möchte. Zum Beispiel möchte ich die Möglichkeit haben, auf Ficture4 zugreifen zu können, auch wenn vorher nach gar nichts gepatch ist.<br />
Wenn ich das einem Vector lösen würde, müsste ich quasi die Versetzung von 4 auf 0 irgendwo mitführen, was mir recht umständlich vorkam.<br />
Mir ist klar, dass CFicture **fictures; ein eher unsauberes Konstrukt darstellt, aber mir ist keine vernünftige Alternative dazu eingefallen.<br />
Würdet ihr sagen, dass es sich lohnt, da noch etwas Hirnschmalz zu investieren und eine Lösung mit std::vector zu finden?</p>
<p>Danke für die Tipps<br />
Jeremin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178717</guid><dc:creator><![CDATA[Jeremin]]></dc:creator><pubDate>Wed, 08 Feb 2012 22:36:40 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 22:39:03 GMT]]></title><description><![CDATA[<p>Jeremin schrieb:</p>
<blockquote>
<p>Wir hatten das in der C++ Übungen so gelöst, daher ging ich davon aus, dass das ein vernünftiger Weg sei. Um reinterpret_cast habe ich bis jetzt einen Bogen gemacht, da dieser ja nicht ganz ungefährlich sei.</p>
</blockquote>
<p>C-Casts sind noch viel gefährlicher als reinterpret_cast, da du damit auch CV-Qualifier wegcasten kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178718</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 08 Feb 2012 22:39:03 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor wird scheinbar grundlos aufgerufen on Wed, 08 Feb 2012 23:36:33 GMT]]></title><description><![CDATA[<p>Oder ums anders zu sagen - C-Style casts statt reinterpret_cast zu verwenden, weil dieser gefährlich ist, ist so ähnlich wie eine Atom-Bombe statt einer Splittergranate zu verwenden, weil die Splittergranate so stark explodiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2178729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2178729</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Wed, 08 Feb 2012 23:36:33 GMT</pubDate></item></channel></rss>