|
Well, forcing the client of B to always use the heap is a very bad policy (even supposing that you are the only client of yoursef: you can forget about it , or you may simply be frustrated by, because, sometimes you may prefer to use the stack).
Anyway it is worth nothing that it doesn't help a lot because you're deleting a memory chunk allocated by the caller on unpredictable (by the caller) grounds: you delete only whenever B constructor raises an exception. This is ugly, since the caller usually (i.e. when all goes fine) relies on that chunk of memory:
int *p;
p = new int[25];
assert(p);
B b(p);
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Thanks CPallini,
I assume that you mean if p always pointed to some object on heap, my code is bug free.
BTW: I agree with your analysis that always making assumption on heap is not a good idea, but in this discussion, I extract my issue in a simple way, and we should discuss under in this simple and special condition.
regards,
George
|
|
|
|
|
George_George wrote: I assume that you mean if p always pointed to some object on heap, my code is bug free.
The above assumption is wrong, since, as I shown, a caller may rely on allocated memory.
int * p;
p = new int[10];
assert(p);
...
...
B b(p);
George_George wrote: I extract my issue in a simple way, and we should discuss under in this simple and special condition.
Under restrictive hypothesis (almost) all will work, for instance, provided B contructor never throws, the original article doesn't make sense (that doesn't mean that restrictive hypothesis are bad, they are one of the foundations of design by contract[^]).
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Thanks CPallini,
I agree that if we do not make safe data backup, there is a bug and the memory pointed by p is deleted.
But from other point, if the data operator (class B) is destroyed, there is no use of the data from some specific perspective.
regards,
George
|
|
|
|
|
Hi,
I am trying to rename a file. The new name of the file is present in another file. The problem is that the renamed file is having junk characters at the beginning. I opened the file in binary mode and found that the chars corresponded to 0xFF and 0xFE. Can anybody help me out?
Thanks!
The code I have is as follows:
{
int nRetCode = 0;
HANDLE fp = CreateFile(_T("KoreanIconNames.txt"), GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(NULL != fp)
{
WCHAR str[BUFFER_SIZE] = {0,};
DWORD dwNumBytesRead = 0;
DWORD dwNumBytesWritten = 0;
size_t ret = 1;
ReadFile(fp, str, sizeof(str), &dwNumBytesRead, NULL);
HANDLE fpNew = CreateFile(_T("KoreanIconNamesNew.txt"), FILE_ALL_ACCESS, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(NULL != fpNew)
{
WriteFile(fpNew, str, sizeof(str), &dwNumBytesWritten, NULL);
CloseHandle(fpNew);
}
// Rename the file
{
CFile fileRename;
WCHAR *pNewName = str;
pNewName = wcstok(str, _T("\n"));
if(NULL != pNewName)
{
CFile::Rename(_T("Citrix.lnk"), pNewName);
}
else
{
AfxMessageBox(_T("Could not tokenize the file name string") );
}
}
CloseHandle(fp);
}
}
AJ
|
|
|
|
|
I can't exactly understand what you are trying to do.
For copying files you can use CopyFile[^] API.
OK I'm not going into the implementation
In my knowledge it's called Byte Order Mark (BOM) which identifies the type of encoding applied to the (text) file. If you are going to rename the file, you dont have to bother about anything Windows Platform will identify it and gives correct name for that.
Please check this article.[^]
just open notepad and save text in different formats. Then open it in any hex-editor(probably visual studio can help you out) and verify each encoding.
<br />
Byte-order mark Description <br />
----------------------------<br />
EF BB BF : UTF-8<br />
FF FE : UTF-16, little endian<br />
FE FF : UTF-16, big endian<br />
FF FE 00 00 : UTF-32, little endian<br />
00 00 FE FF : UTF-32, big-endian
--Update--
Check Byte Order Mark [^] on MSDN
HTH
-Sarath.
"Great hopes make everything great possible" - Benjamin Franklin
modified on Wednesday, December 26, 2007 11:10:08 AM
|
|
|
|
|
Thanks a lot!! You are of great help!
|
|
|
|
|
Two suggestions:
(1) always check how many bytes you effectively read and wrote (and use that info).
(2) use the debugger.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
|
Ajay L D wrote: WriteFile(fpNew, str, sizeof(str), &dwNumBytesWritten, NULL);
Should be:
WriteFile(fpNew, str, dwNumBytesRead, &dwNumBytesWritten, NULL);
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Hello everyone,
Please help to comment whether my following understanding is correct,
1. whether or not we are using auto_ptr to allocate new object on heap (using new), there may be bad_alloc exceptions;
2. when we met with such exceptions, we catch it (bad_alloc) and try to mininize the operation in catch handler block (since when bad_alloc occurs, it means memory is running out, we can not do anything complex in handler).
Both are correct? Please feel free to correct me if I am wrong.
thanks in advance,
George
|
|
|
|
|
George_George wrote: 1. whether or not we are using auto_ptr to allocate new object on heap (using new), there may be bad_alloc exceptions;
IMHO this is not true, if you use, for instance, malloc (of course) exception is never thrown.
George_George wrote: when we met with such exceptions, we catch it (bad_alloc)
We have the possibility of handling it.
George_George wrote: and try to mininize the operation in catch handler block (since when bad_alloc occurs, it means memory is running out, we can not do anything complex in handler).
That isn't exactly true: the request may fail for a huge chunk request and anyway, complex things don't necessarily need a lot of memory and you can also rely on previous allocated memory to do complex things. However, IMHO, "be minimalist!" on such situation, it is a good guideline.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Thanks CPallini,
If we met with bad_alloc, do we need to use delete or delete[] to free the memory in exception handler block?
regards,
George
|
|
|
|
|
George_George wrote: If we met with bad_alloc, do we need to use delete or delete[] to free the memory in exception handler block?
You don't need to free unallocated memory, qutoing MSDN
http://msdn2.microsoft.com/en-us/library/6512dwes(vs.80).aspx[^]:
The class describes an exception thrown to indicate that an allocation request did not succeed.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Thanks CPallini,
But from the link, I can not find it is explicitly mentioned we do not need to delete or delete[] if bad_alloc occurs.
regards,
George
|
|
|
|
|
George: "No memory, no party!"
If bad_alloc is thrown then memory is NOT ALLOCATED then you have not to call neither delete nor delete [] .
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
Thanks CPallini,
My question is answered.
regards,
George
|
|
|
|
|
my complie tool is visual studio6.0.
but some source is made from turbo c.
so i can't complie on the visual studio.
"textattr" <-- that function.
so there are any same function with "textattr" on the visual studio library?
firstly, i am sorry, i am from korea.
and i am not good in wriitting english so please understand~
Thank you everyone~
|
|
|
|
|
AFAIK there isn't a similar function for console programs. On the other hand you have a great control on text attributes of windowed applications, but you have to deal with several issues (event-driven apps, graphical output).
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
[my articles]
|
|
|
|
|
I have created object of tree control as m_TreeCtrl. I want to refresh the tree control on refresh button click to reflect the new changes after adding or deleting the node. I could not find the API for that.
Please help me to find the API for refreshing the tree control.
|
|
|
|
|
Unless you explicitely block, the tree control refreshes itself after inserting/modifying/removing items.
|
|
|
|
|
Hi All,
I have to handle text files of larger sizes ranges from 10GB and more which are exported from some application softwares. The text files contains the required information scattered throughout the file. I need to gather all those information in a particular format to do further analysis. Say for example, if the input file contains as following:
#10 // time stamp 10
0!
1(
1=
#15 // time stamp 15
1!
0:
I have to gather the information as,
! 10 0 15 1
( 10 1
= 10 1
: 10 0
So please suggest me how to store the above gathered information either as a vector, class arrays, or anything else like database e.t.c., The information surely occupies size larger than 10GB. And i have to access the gathered information for further progress.
With Regards,
Sangeetha.
|
|
|
|
|
Hi...
I am working with a Dialog based application. In which i am trying to add features like ptint, help etc. we can achieve this by making CFormView is the base class before making a SDI application. But I dont want the tittle bar & menu. Anybody suggest way of doing this.....
Thanks in advance
sairam
|
|
|
|
|
Hello everyone,
Through my testing and study of RAII (Resource Acquisition Is Initialization) pattern, I think it can solve resource release issue in the following two situations,
1. Local function object (on stack);
2. Object (either on heap or stack) pointer by auto_ptr;
But it has the limitation that the object pointed by a normal pointer and allocated on heap (using new or new[]) can not be automatically released, either the function returns normally or during exception stack unwinding. Is that correct?
thanks in advance,
George
|
|
|
|
|
You can. You could write your own classes or - as I'd recommend - use boost smart pointers.
basically, there is:
scoped_ptr<T> pT(new T) - freed when pT leaves scope
scoped_array<T> paT(new T[77]) - freed when paT leaves scope
shared_ptr<T> pT(new T) - can be assigned to another shared_ptr and deletes T when the last reference goes out of scope
shared_array<T> pT(new T[77]) - as above, but uses delete[]
With shared_ptr you can use a custom deleter, which allows to wrap arbitrary ressources, e.g. malloc'ed or GlobalAlloc'ed pointers.
I've written two articles that give a bit more detail:
Smart Pointers to boost your code[^] for a thorough introduction
shared_ptr wraps resource handles[^] which demonstrates a slightly quirky but efficient way to use the custom deleter.
|
|
|
|
|