Avatar billede jennemaan Nybegynder
28. marts 2001 - 12:51 Der er 11 kommentarer og
2 løsninger

new/delete prop

Jeg folkens,

Jeg har følgende klasse:

// SharpeModel.h: interface for the SharpeModel class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SHARPEMODEL_H__48AA2D96_FDCD_446C_A46E_B9E365BCE6CE__INCLUDED_)
#define AFX_SHARPEMODEL_H__48AA2D96_FDCD_446C_A46E_B9E365BCE6CE__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class SharpeModel 
{
public:


    double *CovarianceMatrix;
    double *StockReturns;
    double *PortfolioWeights;
    double *lbWeights;
    double *ubWeights;
    double *onesVektor;
    double *dummy;
    double SharpeRatio;
    long Assets;
    bool allocated;

   
    void SetUp(long Assets);
    SharpeModel();
    virtual ~SharpeModel();

};

#endif // !defined(AFX_SHARPEMODEL_H__48AA2D96_FDCD_446C_A46E_B9E365BCE6CE__INCLUDED_)


// SharpeModel.cpp: implementation of the SharpeModel class.
//
//////////////////////////////////////////////////////////////////////

#include \"SharpeModel.h\"




void SharpeModel::SetUp(long lAssets)
{
    int i;
    int j;

    this->Assets=lAssets;
    if(allocated==true){

        delete CovarianceMatrix;
        delete PortfolioWeights;
        delete StockReturns;
        delete lbWeights;
        delete ubWeights;
        delete onesVektor;
        delete dummy;}

   
    CovarianceMatrix = new double[Assets*Assets];
    PortfolioWeights=new double[Assets];
    StockReturns=new double[Assets];
    lbWeights=new double[Assets];
    ubWeights=new double[Assets];
    onesVektor=new double[Assets];
    dummy=new double[250000];
    SharpeRatio=0;
    allocated=true;

    for(i=0; i<Assets;i++)
    {
        lbWeights[i]=0;
        ubWeights[i]=100;
        onesVektor[i]=1;

    }

}


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

SharpeModel::SharpeModel()
{
    allocated=false;
}

SharpeModel::~SharpeModel()
{

    if(allocated==true){

        delete CovarianceMatrix;
        delete PortfolioWeights;
        delete StockReturns;
        delete lbWeights;
        delete ubWeights;
        delete onesVektor;
        delete dummy;}

}


Sagen er den at hvis jeg prøver at fyre en delete på en af mine pointere så brager skidtet ned i dbgheap.c.

Compileren er MS VC++ 6.

Hvordan kan jeg lave en skudsikker metode, således at når SharpeModel::Setup bliver kaldet, at jeg så får frigjort evt. \"gamle\" pointere og reallokeret pointerne efter den nye størrelse (lAssets)?

Klassen fungerer fint hvis jeg dropper alt om delete, men tilgengæld kan jeg se at programmet æder af min heap hver gang jeg kalder SharpeModel::Setup.. Da jeg kan forvente op til 1000 assets vil det betyde at den æder ca. 4mb af min heap hver gang jeg kalder SharpeModel::Setup.

(og ja, dummy har jeg kun tilføjet af testhensyn :o) ).


/Jennemaan
Avatar billede jpk Nybegynder
28. marts 2001 - 13:11 #1
Generelt bør du nok initialisere dine pointere til NULL i constructoren. Dette bør ske i dens initializationslist fx:

SharpeModel::SharpeModel()
: allocated(false), CovarianceMatrix(NULL), osv (skal ikke afsluttes med \";\")
{
}

Du behøver heller ikke teste således:
if(allocated==true)
men kan blot skrive
if(allocated)
da indholdet af if-sætningen evalueres i forhold til 0 under testen (blot en bemærkning)

Endnu en bemærkning: en double fylder her 8 byte, så det må være 8MB
Avatar billede jennemaan Nybegynder
28. marts 2001 - 13:17 #2
det ændrer stadig ikke ved at frn brager ned i dbgheap.c når jeg forsøger en delete...

/Jennemaan
Avatar billede jpk Nybegynder
28. marts 2001 - 13:31 #3
Har du checket at dine pointere ikke er NULL før du deleter dem?
fx:
if(CovarianceMatrix)
  delete []CovarianceMatrix;

husk \"[]\"
Avatar billede jennemaan Nybegynder
28. marts 2001 - 13:36 #4
jeps
Avatar billede jpk Nybegynder
28. marts 2001 - 13:40 #5
Er du sikker?
I din kode har du ikke skrevet:
delete []CovarianceMatrix;
men kun
delete CovarianceMatrix;
Avatar billede jpk Nybegynder
28. marts 2001 - 13:41 #6
og naturligvis det samme ved de andre arrays...
Avatar billede jennemaan Nybegynder
28. marts 2001 - 13:46 #7
det gør _ingen_ forskel om jeg skriver
delete []CovarianceMatrix;
eller
delete CovarianceMatrix;

Præcis samme styrt.



Avatar billede mfc Nybegynder
28. marts 2001 - 15:01 #8
Er det ikke kun en Warning om at der ikke findes debug info
Avatar billede jennemaan Nybegynder
28. marts 2001 - 15:14 #9
mfc > joooooooow daaaaaaamn... /bop me :o)

kan du ikke lige svare så du kan få lidt point?

/Jennemaan

Avatar billede michaelmyers Nybegynder
28. marts 2001 - 15:17 #10
Hvad ???

Jeg prøvede koden på i mit MSVC.... den sagde ikke noget om manglende DEBUG INFO...
Avatar billede michaelmyers Nybegynder
28. marts 2001 - 15:17 #11
Men tilgæengæld gav den en assertion fejl....
Avatar billede mfc Nybegynder
28. marts 2001 - 23:52 #12
:-)
Avatar billede jennemaan Nybegynder
29. marts 2001 - 10:28 #13
hehe, jpk fik lige lidt os...

Takker for hjælpen :o)

/Jennemaan
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester