Thread overview | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
August 06, 2012 Error while trying to allocate memory (malloc) | ||||
---|---|---|---|---|
| ||||
The following code: import std.stdio, std.cstream, std.c.stdlib; private { //import rescache.cache; //import mm.mempool; } void main(string[] args) { // press <Return> before program begins din.getc(); memoryPool memPool = new memoryPool(1024); writeln("Block Allocated!"); // press <Return> to end program din.getc(); //return cast(int)0; } // Growable/shrinkable memory pool, for speedy memory allocation class memoryPool { private: // Allocation header, count and keep track of allocs and keep first, last info struct s_allocHeader { int m_allocCount; // count number of allocations from pool s_allocInfo* p_first; // pointer to first allocation info struct s_allocInfo* p_last; // pointer to last alloc info struct (should be null if only one) } // Keep track of allocations from the memory pool struct s_allocInfo { align(4) // align on 4-byte boundaries void* p_data; // pointer to data chunk allocated out void* p_inBlock; // pointer to block this allocation was made in int m_dataSize; // size of allocated chunk s_allocInfo* p_next; // pointer to next allocation list entry } // Block header, count and keep track of system allocs and keep first, last info struct s_blockHeader { int m_blockCount; // count number of allocations from system s_blockInfo* p_first; // pointer to first block info struct s_blockInfo* p_last; // pointer to last block info struct (should be null if only one) } // Keep track of block allocations struct s_blockInfo { align(4) // align on 4-byte boundaries void* p_block; // pointer to the memory allocated from the system int m_blockSize; // size of block allocated from the system bool m_poolMember; // whether or not the block was allocated for the memory pool s_blockInfo* p_next; // pointer to next block list entry } int m_CHUNK_SIZE = 128; // n-byte allocations from the pool int m_BLOCK_SIZE = 4096; // pool block size public: // Allocator //void* alloc(int numChunks = 1, bool useMemPool = true) { } // Deallocator void free() { } // Grow the memory pool void growPool(int numBlocks = 1) { } // Shrink the memory pool void shrinkPool(int numBlocks = 1) { } // Constructor; pass it the initial memory pool size in MB this(int initialPoolSize) { // set up allocation list s_allocHeader* m_allocList; // set up block list s_blockHeader* m_blockList; // create initial block info reference, and set block count to 1 m_blockList.p_first = malloc(s_blockInfo.sizeof); //m_blockList.m_blockCount = 1; // allocate initial block of memory and store it in block info reference //s_blockInfo* tmp = m_blockList.p_first; //tmp.p_block = malloc(cast(size_t)initialPoolSize); //tmp.m_blockSize = initialPoolSize; //tmp.m_poolMember = true; //tmp.p_next = null; } // Deconstructor ~this() { } } // END of c_memoryPool class when compiled, gives the error: Error: cannot implicitly convert expression (malloc(16u)) of type void* to s_blockInfo* on line (75): m_blockList.p_first = malloc(s_blockInfo.sizeof); What is going on here? I even tried using new, but got an Access Violation Any help would be appreciated. |
August 06, 2012 Re: Error while trying to allocate memory (malloc) | ||||
---|---|---|---|---|
| ||||
Posted in reply to CrudOMatic | Maybe you need a cast before malloc to convert it to a "s_blockInfo*"? |
August 06, 2012 Re: Error while trying to allocate memory (malloc) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Minas Mina | On Monday, 6 August 2012 at 13:22:08 UTC, Minas Mina wrote: > Maybe you need a cast before malloc to convert it to a "s_blockInfo*"? Just did, and compiled. Errored out with (from my IDE): > (9:54:32 AM) AccessViolation-Exception > (9:54:32 AM) c0000005 > (9:54:32 AM) Exception in debugger client (9:54:32 AM) IDebugEventCallbacks::Exception > (9:54:32 AM) callback. > (9:54:32 AM) PC: (9:54:32 AM) 09239f05 > (9:54:32 AM) VA: (9:54:32 AM) 00000000 > (9:54:32 AM) R/W: (9:54:32 AM) 0 > (9:54:32 AM) Parameter: (9:54:32 AM) 00000000 > (9:54:32 AM) (9:54:32 AM) Program execution halted... Running it directly gives me: object.Error: Access Violation ---------------- I:\Prog\Projects\D\resource-cache\resource-cache\main.d(13): D main ---------------- |
August 06, 2012 Re: Error while trying to allocate memory (malloc) | ||||
---|---|---|---|---|
| ||||
Posted in reply to CrudOMatic | On Monday, 6 August 2012 at 13:59:35 UTC, CrudOMatic wrote:
> On Monday, 6 August 2012 at 13:22:08 UTC, Minas Mina wrote:
>> Maybe you need a cast before malloc to convert it to a "s_blockInfo*"?
>
> Just did, and compiled. Errored out with (from my IDE):
>> (9:54:32 AM) AccessViolation-Exception
>> (9:54:32 AM) c0000005
>> (9:54:32 AM) Exception in debugger client (9:54:32 AM) IDebugEventCallbacks::Exception
>> (9:54:32 AM) callback.
>> (9:54:32 AM) PC: (9:54:32 AM) 09239f05
>> (9:54:32 AM) VA: (9:54:32 AM) 00000000
>> (9:54:32 AM) R/W: (9:54:32 AM) 0
>> (9:54:32 AM) Parameter: (9:54:32 AM) 00000000
>> (9:54:32 AM) (9:54:32 AM) Program execution halted...
>
> Running it directly gives me:
>
> object.Error: Access Violation
> ----------------
> I:\Prog\Projects\D\resource-cache\resource-cache\main.d(13): D main
> ----------------
You get an Access Violation error because `m_blockList` is null.
|
August 06, 2012 Re: Error while trying to allocate memory (malloc) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Eyyub | On Monday, 6 August 2012 at 14:14:12 UTC, Eyyub wrote:
> On Monday, 6 August 2012 at 13:59:35 UTC, CrudOMatic wrote:
>> On Monday, 6 August 2012 at 13:22:08 UTC, Minas Mina wrote:
>>> Maybe you need a cast before malloc to convert it to a "s_blockInfo*"?
>>
>> Just did, and compiled. Errored out with (from my IDE):
>>> (9:54:32 AM) AccessViolation-Exception
>>> (9:54:32 AM) c0000005
>>> (9:54:32 AM) Exception in debugger client (9:54:32 AM) IDebugEventCallbacks::Exception
>>> (9:54:32 AM) callback.
>>> (9:54:32 AM) PC: (9:54:32 AM) 09239f05
>>> (9:54:32 AM) VA: (9:54:32 AM) 00000000
>>> (9:54:32 AM) R/W: (9:54:32 AM) 0
>>> (9:54:32 AM) Parameter: (9:54:32 AM) 00000000
>>> (9:54:32 AM) (9:54:32 AM) Program execution halted...
>>
>> Running it directly gives me:
>>
>> object.Error: Access Violation
>> ----------------
>> I:\Prog\Projects\D\resource-cache\resource-cache\main.d(13): D main
>> ----------------
>
> You get an Access Violation error because `m_blockList` is null.
So, do I use new or what? In C it was just declare and go...
|
August 06, 2012 Re: Error while trying to allocate memory (malloc) | ||||
---|---|---|---|---|
| ||||
Posted in reply to CrudOMatic | On Monday, 6 August 2012 at 14:55:05 UTC, CrudOMatic wrote: > In C it was just declare and go... Really ? I don't think, because : s_blockHeader* m_blockList; Here, m_blockList is a pointer to s_blockHeader struct, and so the default value is `null`. So, trying to access to(?) a struct member whereas the pointer is set to null, is a nonsense. Tell me if I'm wrong. (I did not programming in C since 2 years) > So, do I use new or what? I do not know what you're trying to do, but if you want a pointer you can use `new` or `malloc`.(it depends on what you need) May be someone can help you better than me. |
August 06, 2012 Re: Error while trying to allocate memory (malloc) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Eyyub | On 8/6/12, Eyyub <eyyub.pangearaion@gmail.com> wrote: > Tell me if I'm wrong. (I did not programming in C since 2 years) You're not wrong. m_blockList is a pointer and OP needs to allocate an s_blockHeader instance before he uses it: s_blockHeader* m_blockList = cast(s_blockHeader*)malloc(s_blockHeader.sizeof); |
August 06, 2012 Re: Error while trying to allocate memory (malloc) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | On Monday, 6 August 2012 at 15:36:03 UTC, Andrej Mitrovic wrote:
> On 8/6/12, Eyyub <eyyub.pangearaion@gmail.com> wrote:
>> Tell me if I'm wrong. (I did not programming in C since 2 years)
>
> You're not wrong. m_blockList is a pointer and OP needs to allocate an
> s_blockHeader instance before he uses it:
>
> s_blockHeader* m_blockList = cast(s_blockHeader*)malloc(s_blockHeader.sizeof);
oops. Thanks. brainfart I guess, been a while since I've used any C like languages.
|
August 06, 2012 Re: Error while trying to allocate memory (malloc) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrej Mitrovic | On Monday, 6 August 2012 at 15:36:03 UTC, Andrej Mitrovic wrote:
> On 8/6/12, Eyyub <eyyub.pangearaion@gmail.com> wrote:
>> Tell me if I'm wrong. (I did not programming in C since 2 years)
>
> You're not wrong. m_blockList is a pointer and OP needs to allocate an
> s_blockHeader instance before he uses it:
>
> s_blockHeader* m_blockList = cast(s_blockHeader*)malloc(s_blockHeader.sizeof);
another quick question - are these allocations automatically entered into the GC heap? If so then I can just disable garbage collection?
|
August 06, 2012 Re: Error while trying to allocate memory (malloc) | ||||
---|---|---|---|---|
| ||||
Posted in reply to CrudOMatic | On 8/6/12, CrudOMatic <crudomatic@gmail.com> wrote:
> another quick question - are these allocations automatically entered into the GC heap? If so then I can just disable garbage collection?
No, there is the standard C malloc/free in std.c.stdlib which you're using, and then there's the GC.malloc and GC.free in core.memory if you want to allocate from the GC heap.
|
Copyright © 1999-2021 by the D Language Foundation