我一直在阅读StackOverflow,并开始怀疑我写过的所有代码,我一直在想"这是不确定的行为?" 甚至在已经工作了很长时间的代码中.
所以我的问题 - 将一个对象(在本例中为抽象接口类)的指针强制转换为void*然后将它们转换回原始类并使用它们调用方法是否安全且定义良好的行为?
我完全清楚这样做的代码可能很糟糕.我现在甚至不考虑这样写它(这是我不想改变的旧代码),所以我不是在寻找更好的方法来讨论它.如果我再次这样做,我已经知道如何更好地写它.但是,如果在C++中实际上已经破坏依赖于此,那么我将不得不考虑更改代码,如果它只是糟糕的代码,那么改变它将不是优先考虑的事情.
我对一年或两年前这么简单的事情毫不怀疑,但随着我对C++的理解增加,我发现我越来越担心代码在标准下是安全的,即使它运行得非常好.也许阅读过多的堆栈溢出有时对生产力是一件坏事:P
我不想实现以下代码 - 检查指针是否为null或不为null.如果指针指向对象,则对该对象执行操作,否则 - 跳过该代码块.
我的代码:
ref class EchoClient {
private:
GameMatrix^ gameMatrix;
public:
EchoClient(void);
EchoClient(GameMatrix^);
void do();
};
EchoClient::EchoClient(void)
{
this->gameMatrix = NULL;
}
EchoClient::EchoClient(gameMatrix)
{
this->gameMatrix = gameMatrix;
}
void EchoClient::do() {
if(this->gameMatrix != NULL)
{
this->gameMatrix->redrawMatrix();
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
error C2446: '!=' : no conversion from 'int' to 'GameMatrix ^' k:\visual studio 2010\Projects\EchoClient3WS\EchoClient3WS\EchoClient.cpp 106
Run Code Online (Sandbox Code Playgroud)
任何解决方案
当使用GDB单步执行程序时,如何检查指针指向的字符串?
我可以看到指针指向0x82c6e10.我知道这是一个字符串.我该如何打印?
使用printf("%s\n", 0x82c6e10)给出Bad format string, missing '"'.gdb不抱怨未知命令的事实告诉我解决方案是我正在做的事情的一些变化.我对吗?我试图逃避报价,但这没有帮助.
如何初始化指向文字数组的指针?
我希望*grid指向新分配的int数组{1,2,3}.
int *grid = new int[3];
*grid = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)
谢谢.
可能重复:
如何摆脱deprecated conversion from string constant to ‘char*’海湾合作委员会的警告?
这项任务:
char *pc1 = "test string";
Run Code Online (Sandbox Code Playgroud)
给了我这个警告:
警告:不推荐将字符串常量转换为'char*'
虽然这个似乎很好:
char *pc2 = (char*)("test string");
Run Code Online (Sandbox Code Playgroud)
这是一个真正更好的方法吗?
注意:由于其他原因我不能使用const char*.
我对指针和它们占用的字节有点困惑.在我的教科书中,它首先说明16位系统上的指针占用2个字节,32位系统占用4个字节,64位系统占用8个字节,依此类推.然后是10行,它表示指针占用了许多字节,这是保存地址所需的.这是我的问题:
可以在go lang中将指针传递到通道上吗?我需要传递struct,对其进行更改并在struct传递的相同函数中进行更改?
我试过了
chan <- &data
Run Code Online (Sandbox Code Playgroud)
我得到了
# command-line-arguments .\o.go:130: cannot use &duom[i] (type *KaVartoti) as type KaVartoti in send
Run Code Online (Sandbox Code Playgroud)
在此之后我尝试了
chan <- *data
Run Code Online (Sandbox Code Playgroud)
我得到了
# command-line-arguments .\o.go:130: invalid indirect of duom[i] (type KaVartoti)
Run Code Online (Sandbox Code Playgroud)
那么,可以通过Go中的通道发送指针吗?
linux内核(和其他地方)中常用的宏container_of是(基本上)定义如下:
#define container_of(ptr, type, member) (((type) *)((char *)(ptr) - offsetof((type), (member))))
Run Code Online (Sandbox Code Playgroud)
在给定指向其中一个成员的指针的情况下,它基本上允许恢复"父"结构:
struct foo {
char ch;
int bar;
};
...
struct foo f = ...
int *ptr = &f.bar; // 'ptr' points to the 'bar' member of 'struct foo' inside 'f'
struct foo *g = container_of(ptr, struct foo, bar);
// now, 'g' should point to 'f', i.e. 'g == &f'
Run Code Online (Sandbox Code Playgroud)
但是,并不完全清楚其中包含的减法是否container_of被视为未定义的行为.
一方面,因为barinside struct foo只是一个整数,所以只*ptr应该是有效的(以及ptr + 1).因此,container_of有效地产生一个表达式 …
我们编写了一个程序,通过它我们试图找到一个常量的地址.有可能这样做吗?
package main
func main() {
const k = 5
address := &k
}
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误,任何人都可以告诉我们如何找到常量的地址?
我有一个工厂方法,它创建一堆对象并返回指向它们的指针.对象的所有权转移给调用者:
std::vector<animal*> create_zoo();
Run Code Online (Sandbox Code Playgroud)
这有效,但容易出现内存泄漏.
auto zoo = create_zoo();
Run Code Online (Sandbox Code Playgroud)
向量在堆栈上并自动清理,包含的对象不是.
返回各种子类型的对象.撤消值而不是指针是行不通的.
我在考虑使用
std::vector<std::unique_ptr<animal> > create_zoo();
Run Code Online (Sandbox Code Playgroud)
但是unique_ptr没有复制语义,我返回了vectorby值,理论上它创建了一个副本.
我可以放在vector堆上以避免这种情况
std::unique_ptr<std::vector<std::unique_ptr<animal> > > create_zoo();
Run Code Online (Sandbox Code Playgroud)
但这太荒谬了.
这也应该有效:
std::vector<std::shared_ptr<animal> > create_zoo();
Run Code Online (Sandbox Code Playgroud)
这可行,但它并没有真正转移所有权.调用者必须假设可能有其他指向对象的指针.
我愿意接受建议.不需要std::vector.我只是在寻找一种实现工厂的好方法,该工厂使用现代c ++返回多个对象的所有权.我现在正在避免提振.我正在尝试探索新的c ++ 11内容.