|
See TN021[^] and TN022[^]
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" mYkel - 21 Jun '04
Within you lies the power for good - Use it!
|
|
|
|
|
Ok I have just inherited a piece of C++ .NET code( i feel like a proud PAPA ).
This C++ .NET code in the form of assemblies that interface with another set of C# assemblies which are being called from a ASP.NET project. The problem is that when the ASP .NET project is executed..i can just see the resources on this process going from 72,000K to almost 154,000K in a hurry and progressively getting "worst".
So, my first thought is memory leak in the C++ assemblies. Here are the questions.
1. Can i use #define CRTDBG_MAP_ALLOC to debug memory leaks in dll's.
2. Technically according to MS I should put
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
at the start of my program.
So, since it is a just a class library..where would the _CrtSetDbgFlag go.
thanks
Sameer
|
|
|
|
|
If it is possible the best approach to developing components is to isolate them so that as much functionality as possible can be executed from a native environment. In this case that would be VC.NET C++ WinForms application.
In fact that is the method I have always used to develop components in C++. I use a desktop application project to develop all the main C++ classes that will be used in the components. Then you create a second project, COM, .NET Assembly, whatever and add the classes to it and wrap them in the desired interface(s). That way you can always go back to the developement project and execute the C++ code in isolation for testing things like memory leaks.
But, that's just my opinion... I could be wrong.
"No matter where you go, there your are." - Buckaroo Banzai
-pete
|
|
|
|
|
// D.cpp: Singleton returning pointer to polymorphic class
//
// [Q] How to change definitions of derived classes to disallow
// direct construction of derived objects?
// ie CDerived1 D1 or CDerived2* D2 = new CDerived2 should not
// possible!
//
#include "stdafx.h"
#include <iostream>
#include <memory>
#include <cassert>
using namespace std;
///////////////////////////////////////////////////////////////////////////////
static int Type(0);
/////////////////////////////////////////////////////////////////// forwards //
class CBase;
class CDerived1;
class CDerived2;
///////////////////////////////////////////////////////////////////////////////
class CBase
{
public:
static CBase* GetInstance();
virtual ~CBase();
virtual ostream& Print(ostream& os) const;
protected:
CBase();
CBase(const CBase&); // not implemented
CBase& operator=(const CBase&); // not implemented
private:
static auto_ptr<cbase> Instance_; // will auto destroy
};
///////////////////////////////////////////////////////////////////////////////
class CDerived1 : public CBase
{
public:
virtual ~CDerived1();
ostream& Print(ostream& os) const;
public: // but should be protected to disallow direct creation
CDerived1();
CDerived1(const CDerived1&); // not implemented
CDerived1& operator=(const CDerived1&); // not implemented
};
///////////////////////////////////////////////////////////////////////////////
class CDerived2 : public CBase
{
public:
virtual ~CDerived2();
ostream& Print(ostream& os) const;
public: // but should be protected to disallow direct creation
CDerived2();
CDerived2(const CDerived2&); // not implemented
CDerived2& operator=(const CDerived2&); // not implemented
};
///////////////////////////////////////////////////////////////////////////////
ostream& operator<<(ostream& os, const CBase& rhs)
{ return rhs.Print(os); };
ostream& operator<<(ostream& os, const CDerived1& rhs)
{ return rhs.Print(os); };
ostream& operator<<(ostream& os, const CDerived2& rhs)
{ return rhs.Print(os); };
///////////////////////////////////////////////////////////////////////////////
auto_ptr<cbase> CBase::Instance_;
CBase::CBase()
{ cout << "Base: ctor\n"; }
CBase::~CBase()
{ cout << "Base: dtor\n"; }
CBase* CBase::GetInstance()
{
// as coded is not thread-safe! required double-check/lock
//
if (Instance_.get() == NULL)
{
switch (Type)
{
case 1:
Instance_.reset(new CDerived1);
break;
case 2:
Instance_.reset(new CDerived2);
break;
default:
assert(0);
break;
}
}
return Instance_.get();
}
ostream& CBase::Print(ostream& os) const
{
return os<< "CBase::Print Address=0x" << hex << (Instance_.get()) << dec;
};
///////////////////////////////////////////////////////////////////////////////
CDerived1::CDerived1()
: CBase()
{ cout << "CDerived1: ctor\n"; }
CDerived1::~CDerived1()
{ cout << "CDerived1: dtor\n"; }
ostream& CDerived1::Print(ostream& os) const
{ CBase::Print(os); os << "\nCDerived1::Print"; return os; }
///////////////////////////////////////////////////////////////////////////////
CDerived2::CDerived2()
: CBase()
{ cout << "CDerived2: ctor\n"; }
CDerived2::~CDerived2()
{ cout << "CDerived2: dtor\n"; }
ostream& CDerived2::Print(ostream& os) const
{ CBase::Print(os); return os << "\nCDerived2::Print"; };
///////////////////////////////////////////////////////////////////////////////
int main(int, char**)
{
::Type = 2;
CBase* B2 = CBase::GetInstance(); // get a CDerived2
cout << *B2 << endl << endl;
CDerived1 D1; // should not be allowed
cout << D1 << endl << endl;
CDerived2* D2 = new CDerived2; // should not be allowed
cout << *D2 << endl << endl;
delete D2;
return 0;
}
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
There is a reason that Singleton is a Software Design Pattern
"No matter where you go, there your are." - Buckaroo Banzai
-pete
|
|
|
|
|
I appreciate your taking the time to look at this question but your "answer" is less than helpful. The singleton pattern is implemented correctly; I've even implemented the auto_ptr to destroy on exit and noted the need for thread-safety (not required in this simple testbed). I've reread the GoF section on singletons and search >100 sites, lots of info on regular classes but nothing on polymorphic classes. The GoF site shows a polymorphic use but the ctor is public in all the dervied classes, so, they could be directly instantiated.
So, again, how to ensure derived classes are not implemented directly.
|
|
|
|
|
kylur wrote:
your "answer" is less than helpful
Yes that is correct. I did not understand the point or goal of your design and actually still don't. Perhaps Mr. Binns solution is what you were looking for.
Good luck
|
|
|
|
|
Make the derived constructors private (or protected ), and add "friend CBase; " to your derived class definition.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Much appreciated... exactly what I needed.
Thank you,
Kylur.
|
|
|
|
|
I want to check if a file path I have is valid and refers to a file before actually going ahead and opening it. Is there a quick and easy way using MFC, the Platform SDK, or the runtime library to check this?
Joel Holdsworth
|
|
|
|
|
Just open the file. Given that you're using a multitasking operating system, there's always a chance that the file could be deleted, renamed, moved, whatever between the time that you check, and the time that you open it.
If you really insist on doing it this way, you could try using FindFirstFile/FindNextFile.
Edit: MFC has the CFileFind class, which wraps these APIs.
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
try{
//try opening the file here
catch(someexception){
//the file path is not valid...
}
this way if the filepath does exist you don't have to do that extra step.
Good luck.
"If I don't see you in this world, I'll see you in the next one... and don't be late." ~ Jimi Hendrix
|
|
|
|
|
<br />
CFile f;<br />
CFileStatus fs;<br />
<br />
if(f.GetStatus(lpszFileName, fs))<br />
{<br />
}<br />
else<br />
Arjan
|
|
|
|
|
GetFileAttributes(path) != (DWORD)-1
But this makes sense only if you can drop additional code between the check and the file open request
we are here to help each other get through this thing, whatever it is Vonnegut jr.
sighist || Agile Programming | doxygen
|
|
|
|
|
|
_access() is one of several ways.
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|
|
I think opening the file with fopen() or CFile() would be easy and fast. I use that function too:
BOOL FileExists(LPCTSTR lpFileName)
{<br />
DWORD dwFileAttr = GetFileAttributes(lpFileName);<br />
<br />
if ((dwFileAttr != 0xFFFFFFFF) &&<br />
!(dwFileAttr & FILE_ATTRIBUTE_DIRECTORY))<br />
return TRUE;<br />
else<br />
return FALSE;<br />
}
I think that should be enough solutions for that problem.
|
|
|
|
|
Joel Holdsworth wrote:
I want to check if a file path I have is valid and refers to a file before actually going ahead and opening it. Is there a quick and easy way using MFC, the Platform SDK, or the runtime library to check this?
there is api called PathFileExist(),try that
-----------------------------
"I Think It will Work"
Formerly Known As "Alok The Programmer" at CP
-----------------------------
Alok Gupta
visit me at http://www.thisisalok.tk
|
|
|
|
|
I've to check the status of a TCP connection (managed using CSocket objects) in order to know the status of the remote client/server and the status of the physical connection.
I've implemented a dedicated thread that periodically tryes to send a zero byte packet to the client/server.
It works good to check the status of the remote client/server but, if the physical connection is broken (cable disconnected) it doesn't works! The send operation doesn't fail !
How can I detect the physical disconnection ?
Are there some specific settings for the CSockect object ?
Thanks a lot !
|
|
|
|
|
I am not familiar with CSocket. In raw winsock, one solution is via select().
Kuphryn
|
|
|
|
|
You derive from it and override CAsyncSocket::OnClose()
"No matter where you go, there your are." - Buckaroo Banzai
-pete
|
|
|
|
|
Hi,
Is there a rule of MFC that does not allow thread creation from CMainFrame?
The situation is the following:
I have a menu function that wants to create a thread using
::CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) ThreadAnalyse, &m_stThreadArg, 0, &dw);
The ThreadAnalyse Function is a static global function, not a member of CMainFrame. The m_stThreadArg is a member of CMainFrame and contains 4 pointer to the CMainFrame Object and 3 pointers to other data.
However it appears that once the menu handler function has returned the whole computer hangs up and runs very slowly. If I place a break point in the Thread function the function is not called for a very long time. Once the function returns the computer returns to normal operational conditions and timings.
Does anyone know why this is?
regards,
RichardS
"Programming today is a race between software engineers striving to build bigger and
better idiot-proff programs, and the Universe trying to produce bigger and better idiots.
So far the Universe is winning." -- Rich Cook
|
|
|
|
|
Where in CMainFrm() does the program call CreateThread()?
Kuphryn
|
|
|
|
|
The function is an afx message handler from a menu.
void CMainFrame::OnFileOpenstream (void) is the prototype.
"Programming today is a race between software engineers striving to build bigger and
better idiot-proff programs, and the Universe trying to produce bigger and better idiots.
So far the Universe is winning." -- Rich Cook
|
|
|
|
|
RichardS wrote:
contains 4 pointer to the CMainFrame Object
Do not pass MFC objects across threads. This is a well known issue and is documented on MSDN.
"No matter where you go, there your are." - Buckaroo Banzai
-pete
|
|
|
|