Jump to content
  • Advertisement
Sign in to follow this  
Gink

Scope question

This topic is 4711 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

This code shouldnt work correctly, right? The objects stored at the adress are destroyed when the loop is over so why does this still function as normal? b is derived class of A.
    vector<A*> vec;
    
    for(int x=0; x < 10; x++){
        B ob;
        vec.push_back(&ob);
    }
    
    vec[5]->getv();

Share this post


Link to post
Share on other sites
Advertisement
I wouldn't be surprised if the compiler was waiting until the end of the routine to free the memory, either that or what Invader X said.

Share this post


Link to post
Share on other sites
I did a test by storing addresses of classes in a vector, by storing the x value inside of them ( from 0 to 9 ). After the loop exited every vector had the last x value stored in it, which was 9.

Share this post


Link to post
Share on other sites
Well, what compiler are you using? You could probably look at the assembly generated by the compiler to see what it's doing; actually, I guess I can test it right now.

Share this post


Link to post
Share on other sites
Dev-cpp IDE, mingw32-c++ compiler, how do I do that? I cant even get the debugger on this working, it doesnt do anything.

Share this post


Link to post
Share on other sites
Well, you'd have to know assembly. Here's a test program I compiled:

#include <stdio.h>

int main() {
for(int i=0; i<10; ++i) {
int c = i;
printf("%d\n", c);
}

return 0;
}



It's in C, but it shouldn't matter. Anyway, this is what gcc produced for the assembly output:

.file "test.c"
.section .rodata
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
.LFB3:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
subq $16, %rsp
.LCFI2:
movl $0, -4(%rbp)
.L2:
cmpl $9, -4(%rbp)
jle .L5
jmp .L3
.L5:
movl -4(%rbp), %eax
movl %eax, -8(%rbp)
movl -8(%rbp), %esi
movl $.LC0, %edi
movb $0, %al
call printf
leaq -4(%rbp), %rax
incl (%rax)
jmp .L2
.L3:
movl $0, %eax
leave
ret
.LFE3:
.size main, .-main
.section .eh_frame,"a",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string ""
.uleb128 0x1
.sleb128 -8
.byte 0x10
.byte 0xc
.uleb128 0x7
.uleb128 0x8
.byte 0x90
.uleb128 0x1
.align 8
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.quad .LFB3
.quad .LFE3-.LFB3
.byte 0x4
.long .LCFI0-.LFB3
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE1:
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.3.5 (Debian 1:3.3.5-8ubuntu2)"


This was compiled on a 64-bit machine, and my assembly skills aren't what they used to be, but from what I can make out it looks like gcc, and by extension mingw, allocate and deallocate stack space on-demand for blocks, meaning Invader X is probably right.

Share this post


Link to post
Share on other sites
i know assembly, but this debugger doesnt even do anything, im used to DOS Debug, not this Dev-CPP Debug that has no effect.

Share this post


Link to post
Share on other sites
The reason it works is that the vector does a copy of the object. You probably don't implement a copy cstr or operator= so it does a memberwise copy creating a new copy of your objects.

Cheers
Chris

Share this post


Link to post
Share on other sites
Quote:
Original post by chollida1
The reason it works is that the vector does a copy of the object. You probably don't implement a copy cstr or operator= so it does a memberwise copy creating a new copy of your objects.

Cheers
Chris

He's pushing the address of the objects, not the actual objects themselves.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!