Scope question

Started by
11 comments, last by Nypyren 18 years, 9 months ago
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();
Advertisement
Perhaps the memory at that location hasnt yet been overwritten allowing you to still use the objects.
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.
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.
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.
Dev-cpp IDE, mingw32-c++ compiler, how do I do that? I cant even get the debugger on this working, it doesnt do anything.
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, @functionmain:.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.
i know assembly, but this debugger doesnt even do anything, im used to DOS Debug, not this Dev-CPP Debug that has no effect.
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
CheersChris
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.

This topic is closed to new replies.

Advertisement