Re: Templates, Structs and Invalid Pointers - where did it go wrong
DaveJ wrote:
[...]
Another class defines a struct, that contains this template class as a
member. In one function the struct is created, but when it goes out
of scope the program cores.
It doesn't core for me (unfortunately)
Examining the core it appears a call to free in the template classes
destructor caused the core. When I traced through the code with the
Here is even smaller example producing exactly what you are doing:
int main()
{
int a = 5;
int *b = &a;
free( b );
}
debugger I found that after the template class constructor exits, the
address that one of its member's points to changes.
Anyway I've included a cut down and simplified version of the code
below. I found the resolution was to modify the struct so that it
takes a reference to the template class.
I guess you are out of luck. What you are doing is not allowed.
------ VarBuf Class <VarBuf.h> ------
#ifndef __TVARBUF_H__
#define __TVARBUF_H__
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
These are c headers. Should be:
#include <cstddef>
#include <cstring>
#include <cstdlib>
template<size_t N> class TVarBuf
{
public:
TVarBuf (const char *initStr);
~TVarBuf ();
private:
char m_Buf[N + 1];
char* m_Str;
size_t m_Capacity;
size_t m_Length;
};
#endif
template<size_t N>
TVarBuf<N>::TVarBuf(const char *initStr) :
initStr is not used
m_Str(NULL),
m_Capacity(N),
m_Length(0)
{
m_Str = m_Buf;
m_Str[0] = '\0';
}
template<size_t N>
TVarBuf<N>::~TVarBuf()
{
if(m_Str != m_Buf)
should be
if (m_Str != &m_Buf[0])
{
free(m_Str);
Where do you allocate this memory?
}
}
---------------------------------
---- Main App <main.cpp> -----
1 #include "VarBuf.h"
2 #include "stdio.h"
3 #include "time.h"
Do not use c headers in a c++ program
4 typedef TVarBuf<6> ProfKey; // Create a typedef for our template
class
This typedef looks very C-ish
5 typedef struct
6 {
7 time_t m_CurrTime;
8 int m_Docs;
9 int m_OldDocs;
10 ProfKey m_OldestProfUrl; // this is the template class
11 } Prof;
12
13 int main(int argc, char** argv)
14 {
15 {
16 time_t now = time(NULL);
17 Prof profile = {now, 0, 0, NULL};
18 } // Application cores after it leaves here and the profile
object goes out of scope
19 return 0;
20 }
------------------------------------------
Compiling the above code with the following command
g++ -g -Wall -omain main.cpp
and running the main binary results in:
free(): invalid pointer 0xbfffd66c!
I modified the code slightly so that line 10 of main reads:
-----------------------------------------------
ProfKey& m_OldestProfUrl; //take a reference to ProfKey
-----------------------------------------------
and line 17 now reads
------------------------------------------------
ProfKey key(NULL);
Prof profile = {now, 0, 0, key}
------------------------------------------------
This doesn't solve your problem, which is in the TVarBuf class