How to make the heap address(by new) have the same every time the program runs?
-
char* str = new char[128];
At first run, the address of str is 0x12345678, and second run, the address of str is 0x00123456, I want the address of str constant, not change every time run. I wish: At first run, the address of str is 0x12345678, and second run, the address of str is 0x12345678, every time run, the address of str is 0x12345678.
-
char* str = new char[128];
At first run, the address of str is 0x12345678, and second run, the address of str is 0x00123456, I want the address of str constant, not change every time run. I wish: At first run, the address of str is 0x12345678, and second run, the address of str is 0x12345678, every time run, the address of str is 0x12345678.
There's no mechanism within C++ to do that. In fact, modern run time systems are designed so that program data spaces are different for each program invocation. For example:
$ cat example.c
\#includeint main()
{
int n;
printf("&n = %p\n" , &n);
}
$ for ((i=0;i<4;++i)); do ./example; done
&n = 0x7fff2ddda67c
&n = 0x7ffdece1243c
&n = 0x7ffe42e7d2bc
&n = 0x7fffd2e78b2c
$Note that even this simple program gives different addresses for the address of
int n
on successive runs. This is to make it difficult for any malicious program to interfere with and modify a running program, or to predict where a program will place data. Also note that in any modern OS (outside of some embeded applications), you are dealing with virtual addresses anyway, so where your process thinks an object is and where the object actually is in physical memory are completely different, so you need to know things like the value page frames and things to work out a physical address of an object in memory. Outside of some sort of educational value, I can't see any up side to always getting the same address when callingnew
, so maybe you might want to think about why you want this behavior and come up with a new plan. -
char* str = new char[128];
At first run, the address of str is 0x12345678, and second run, the address of str is 0x00123456, I want the address of str constant, not change every time run. I wish: At first run, the address of str is 0x12345678, and second run, the address of str is 0x12345678, every time run, the address of str is 0x12345678.
-
char* str = new char[128];
At first run, the address of str is 0x12345678, and second run, the address of str is 0x00123456, I want the address of str constant, not change every time run. I wish: At first run, the address of str is 0x12345678, and second run, the address of str is 0x12345678, every time run, the address of str is 0x12345678.
Are you referring to either the
/base
or/fixed
linker option?"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
-
char* str = new char[128];
At first run, the address of str is 0x12345678, and second run, the address of str is 0x00123456, I want the address of str constant, not change every time run. I wish: At first run, the address of str is 0x12345678, and second run, the address of str is 0x12345678, every time run, the address of str is 0x12345678.
The question is stupid, there is no way a dynamic heap manager can guarantee it wont give the memory space away to some other call for memory allocation. To do what you asked it would have to keep the memory "available" anyhow, so for the love of all things coding just declare the thing static in that case (unless you actually want a global). My C++ is rusty with string objects but it should be something like
static char* str = char[128];
In C it is simpler
static char str[128];
Problem solved it now has the same address everytime locally, and effectively does the same thing that any crazy heap manager doing what you asked would have to do. I am assuming you are going to change the string at times, so you want a variable not a constant.
In vino veritas
-
The question is stupid, there is no way a dynamic heap manager can guarantee it wont give the memory space away to some other call for memory allocation. To do what you asked it would have to keep the memory "available" anyhow, so for the love of all things coding just declare the thing static in that case (unless you actually want a global). My C++ is rusty with string objects but it should be something like
static char* str = char[128];
In C it is simpler
static char str[128];
Problem solved it now has the same address everytime locally, and effectively does the same thing that any crazy heap manager doing what you asked would have to do. I am assuming you are going to change the string at times, so you want a variable not a constant.
In vino veritas
-
There's no mechanism within C++ to do that. In fact, modern run time systems are designed so that program data spaces are different for each program invocation. For example:
$ cat example.c
\#includeint main()
{
int n;
printf("&n = %p\n" , &n);
}
$ for ((i=0;i<4;++i)); do ./example; done
&n = 0x7fff2ddda67c
&n = 0x7ffdece1243c
&n = 0x7ffe42e7d2bc
&n = 0x7fffd2e78b2c
$Note that even this simple program gives different addresses for the address of
int n
on successive runs. This is to make it difficult for any malicious program to interfere with and modify a running program, or to predict where a program will place data. Also note that in any modern OS (outside of some embeded applications), you are dealing with virtual addresses anyway, so where your process thinks an object is and where the object actually is in physical memory are completely different, so you need to know things like the value page frames and things to work out a physical address of an object in memory. Outside of some sort of educational value, I can't see any up side to always getting the same address when callingnew
, so maybe you might want to think about why you want this behavior and come up with a new plan.Thanks
-
You could mimic that implementing you own memory manager and then globally replacing the default
new
operator.Thanks
-
Are you referring to either the
/base
or/fixed
linker option?"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
First, I use Visual Studio. Invalid after adding add "/fixed" linker option. and error LNK1146: no argument specified with option '/base'