class 实例的地址是否等于 class 中唯一元素的地址
Is the address of an class instance equal with the address of the unique element in the class
我正在研究一段用 g++-7.4 编译的 C+ 代码
我的问题是 return 来自 class B 的 class 成员的地址是否安全,并将其分配为 class A 的指针,其中该成员是唯一的.
让我们用下面的例子把它弄清楚
#include "pch.h"
#include <iostream>
class DummyMsg
{
public:
DummyMsg () = default;
DummyMsg(const DummyMsg &) = default;
~DummyMsg()=default;
};
class ROCallContext
{
public:
ROCallContext() = default;
ROCallContext(const ROCallContext &) = default;
~ROCallContext() = default;
DummyMsg *dummyMsg;
};
class RWCallContext
{
public:
RWCallContext()
{
dummyMsg = new DummyMsg();
}
~RWCallContext()
{
}
void* getDummyMsg()
{
return reinterpret_cast<void *>(dummyMsg);
}
int i;
double d;
char * pc;
DummyMsg *dummyMsg;
char c_array[100];
};
int main()
{
RWCallContext * rwCallContext = new RWCallContext();
ROCallContext * ctx = reinterpret_cast<ROCallContext *>(rwCallContext->getDummyMsg());
}
ROCallContext::dummyMsg是否等于RWCallContext::dummyMsg?
ROCallContext::dummyMsg和RWCallContext::dummyMsg的内容一样吗?
是否取决于编译器优化?
这将是一个真正的成功或失败,因为你的问题有点模糊。
传递指针是否安全.. 是的,当然,如果您跟踪它,当代码变大时您可能无法做到这一点。如果您需要传递指针,请改用 shared_ptr。
无论如何,如果您 运行 这段代码,如果指针相等,它有望解释您的第二个问题。希望它对你有意义。
#include <iostream>
class DummyMsg {
public:
int i = 0;
};
class ROCallContext {
public:
ROCallContext(DummyMsg *msg) {
dummyMsg = msg;
}
DummyMsg *dummyMsg;
};
class RWCallContext {
public:
RWCallContext() {
dummyMsg = new DummyMsg();
}
DummyMsg* getDummyMsg() {
return dummyMsg;
}
DummyMsg *dummyMsg;
};
int main() {
RWCallContext * rwCallContext = new RWCallContext();
ROCallContext * ctx = new ROCallContext(rwCallContext->getDummyMsg());
printf("Address of RW is %p\n", (void *)rwCallContext->dummyMsg);
printf("Address of RO is %p\n", (void *)ctx->dummyMsg);
printf("RO i: %i\n", ctx->dummyMsg->i);
printf("RW i: %i\n", rwCallContext->dummyMsg->i);
printf("Changing value for RW\n");
rwCallContext->dummyMsg->i = 2;
printf("RO i: %i\n", ctx->dummyMsg->i);
printf("RW i: %i\n", rwCallContext->dummyMsg->i);
delete rwCallContext->dummyMsg;
delete rwCallContext;
delete ctx;
}
编辑:刚刚意识到问题可能是,即使您投射的 class from/into 没有相同的结构,dummyMsg 是否会是相同的值。
如果是这样的话,也许这个例子可以解释为什么它可能不会有相同的值。
#include <stdio.h>
struct A {
int x;
int y;
};
struct B {
int y;
int x;
};
int main() {
struct A a = {1, 2};
struct B *b = (struct B*)&a;
printf("Struct A x: %i, y: %i\n", a.x, a.y);
printf("Struct B x: %i, y: %i\n", b->x, b->y);
}
Output:
Struct A x: 1, y: 2
Struct B x: 2, y: 1
我正在研究一段用 g++-7.4 编译的 C+ 代码 我的问题是 return 来自 class B 的 class 成员的地址是否安全,并将其分配为 class A 的指针,其中该成员是唯一的. 让我们用下面的例子把它弄清楚
#include "pch.h"
#include <iostream>
class DummyMsg
{
public:
DummyMsg () = default;
DummyMsg(const DummyMsg &) = default;
~DummyMsg()=default;
};
class ROCallContext
{
public:
ROCallContext() = default;
ROCallContext(const ROCallContext &) = default;
~ROCallContext() = default;
DummyMsg *dummyMsg;
};
class RWCallContext
{
public:
RWCallContext()
{
dummyMsg = new DummyMsg();
}
~RWCallContext()
{
}
void* getDummyMsg()
{
return reinterpret_cast<void *>(dummyMsg);
}
int i;
double d;
char * pc;
DummyMsg *dummyMsg;
char c_array[100];
};
int main()
{
RWCallContext * rwCallContext = new RWCallContext();
ROCallContext * ctx = reinterpret_cast<ROCallContext *>(rwCallContext->getDummyMsg());
}
ROCallContext::dummyMsg是否等于RWCallContext::dummyMsg? ROCallContext::dummyMsg和RWCallContext::dummyMsg的内容一样吗?
是否取决于编译器优化?
这将是一个真正的成功或失败,因为你的问题有点模糊。
传递指针是否安全.. 是的,当然,如果您跟踪它,当代码变大时您可能无法做到这一点。如果您需要传递指针,请改用 shared_ptr。
无论如何,如果您 运行 这段代码,如果指针相等,它有望解释您的第二个问题。希望它对你有意义。
#include <iostream>
class DummyMsg {
public:
int i = 0;
};
class ROCallContext {
public:
ROCallContext(DummyMsg *msg) {
dummyMsg = msg;
}
DummyMsg *dummyMsg;
};
class RWCallContext {
public:
RWCallContext() {
dummyMsg = new DummyMsg();
}
DummyMsg* getDummyMsg() {
return dummyMsg;
}
DummyMsg *dummyMsg;
};
int main() {
RWCallContext * rwCallContext = new RWCallContext();
ROCallContext * ctx = new ROCallContext(rwCallContext->getDummyMsg());
printf("Address of RW is %p\n", (void *)rwCallContext->dummyMsg);
printf("Address of RO is %p\n", (void *)ctx->dummyMsg);
printf("RO i: %i\n", ctx->dummyMsg->i);
printf("RW i: %i\n", rwCallContext->dummyMsg->i);
printf("Changing value for RW\n");
rwCallContext->dummyMsg->i = 2;
printf("RO i: %i\n", ctx->dummyMsg->i);
printf("RW i: %i\n", rwCallContext->dummyMsg->i);
delete rwCallContext->dummyMsg;
delete rwCallContext;
delete ctx;
}
编辑:刚刚意识到问题可能是,即使您投射的 class from/into 没有相同的结构,dummyMsg 是否会是相同的值。 如果是这样的话,也许这个例子可以解释为什么它可能不会有相同的值。
#include <stdio.h>
struct A {
int x;
int y;
};
struct B {
int y;
int x;
};
int main() {
struct A a = {1, 2};
struct B *b = (struct B*)&a;
printf("Struct A x: %i, y: %i\n", a.x, a.y);
printf("Struct B x: %i, y: %i\n", b->x, b->y);
}
Output:
Struct A x: 1, y: 2
Struct B x: 2, y: 1