草庐IT

$C指针

全部标签

c++ - 在析构函数中删除指针时崩溃

我遇到了对C++指针缺乏深刻理解的问题。我编写了一个名为Skymap的类,它具有以下定义:classSkymap{public:Skymap();~Skymap();voidDrawAitoffSkymap();private:TCanvasmCanvas;TBox*mSkymapBorderBox;};函数定义为:#include"Skymap.h"Skymap::Skymap(){mCanvas.SetCanvasSize(1200,800);mMarkerType=1;}Skymap::~Skymap(){deletemSkymapBorderBox;}voidSkymap::D

C++ char * 指针传递给函数并删除

我有以下代码:#includeusingnamespacestd;voidfunc(char*aString){char*tmpStr=newchar[100];cin.getline(tmpStr,100);delete[]aString;aString=tmpStr;}intmain(){char*str=newchar[100];cin.getline(str,100);cout为什么第二个cout不打印第二个输入字符串?我怎样才能更改此代码以使其正常工作? 最佳答案 正如GregS所说,简单的答案是使用引用来声明您的函数:v

c++ - C 和 C++ 中 void 指针的区别

为什么以下在C++中是错误的(但在C中有效)void*p;char*s;p=s;s=p;//thisiswrong,shoulddos=(char*)p;为什么我需要转换,因为p现在包含char指针的地址并且s也是char指针? 最佳答案 这是有效的C,但不是C++;它们是两种不同的语言,即使它们确实有许多共同点。在C++中,没有从void*到类型化指针的隐式转换,因此您需要进行强制转换。您应该更喜欢C++转换,因为它们限制了允许的转换,因此有助于防止错误:s=static_cast(p);更好的是,您应该首先使用多态技术(例如抽象

c++ - 为什么我不应该总是使用 shared_ptr 和 unique_ptr 而是使用普通指针?

我有C#和obj-c的背景,所以RC/GC是我(仍然)珍视的东西。当我开始更深入地学习C++时,我一直想知道为什么在它们如此不受管理时我会使用普通指针而不是其他替代解决方案?shared_ptr提供了一种很好的方式来存储引用并且不会在不删除它们的情况下丢失它们。我可以看到普通指针的实用方法,但它们似乎只是不好的做法。有人可以解释这些替代方案吗? 最佳答案 当然,如果他们拥有指针,我们鼓励您使用共享和唯一的ptr。但是,如果您只需要一个观察者,那么原始指针就可以了(指针不对其指向的任何内容负责)。std::uniqe_ptr基本上没有

c++删除两个指针引用的对象

我很好奇是否有一种优雅的方法可以解决C++中的以下问题:我有一个模拟器应用程序,其中包含多个通过channel连接的组件。channel可以是网络channel(需要应用程序的两个实例)或虚拟本地channel。有两个接口(interface):IChannelIn和IChannelOut以及两个对应的变量:IChannelIn*in;IChannelOut*out;DummyChannel是IChannelIn和IChannelOut。它只是将输入复制到输出。还有TCPChannelIn:publicIChannelIn和单独的TCPChannelOut:publicIChannel

c++ - 标记/编码指针

我需要一种方法将指针标记为集合x的一部分或集合y的一部分(即:标记只有2个“状态”),我的意思是可以假设未标记=x和标记=是的。目前我正在考虑使用按位异或来执行此操作:ptr^magic=encoded_ptrencoded_ptr^magic=ptr但我对如何确定指针是否首先被标记感到困惑。我用它来标记链表中的池节点来自哪些池节点,这样当它们被取消链接时,它们可以返回到正确的perants。更新只是为了让所有那些建议将标志存储在额外数据成员中的人清楚,我仅限于sizeof(void*),所以我不能添加新成员,否则我会。此外,池不是连续的,它们由许多页面组成,跟踪范围会增加太多开销(我

c++ - 如何使用 memset 将指向内存的指针设置为 NULL?

我有一个结构typedefstructmy_s{intx;...}my_T;my_t*p_my_t;我想将p_my_t的地址设置为NULL,到目前为止,这是我尝试这样做的方式:memset(&p_my_t,0,sizeof(my_t*))不过我觉得这不太对。这样做的正确方法是什么?问题修正-提出更复杂的问题:这是我正在尝试做的事情:两个进程,A和BA、B中的mallocp_my_t有N个线程可以访问开始在A中删除,但我不能简单地释放它,因为B中的线程可能仍在使用它。所以我调用一个函数,将p_my_t的地址传递给B以将它在B中的地址设置为NULL,这样B中的其他线程就不能再使用了从B回调

c++ - 将指向堆栈变量的指针传递给 realloc() 是否有效?

intmain(){charmyString=NULL;realloc(&myString,5);strncpy((char*)&myString,"test",5);}似乎工作正常,但我仍然对堆栈和堆有点困惑。这是允许的吗?如果允许的话,myString是需要手动释放还是超出作用域就释放?编辑:感谢您的回复,所以我认为这同样是非法的//IwantthecodetochangemyStringto"tests"charmyString[5]="test";realloc(&myString,strlen(myString)+2);myString[4]='s';myString[5]=

c++删除指针问题,仍然可以访问数据

很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭11年前。我真的不明白为什么这些指针可以访问......感谢任何帮助#includeclassWicked{public:Wicked(){};virtual~Wicked(){};inta;intb;};classTest{public:Test(){};virtual~Test(){};intc;Wicked*TestFunc(){Wicked*z;c=9;z=newWicked;z->a=1;z->

c++ - 在 C++ 中交换指针地址

如何在带有签名的函数内交换指针地址?假设:intweight,height;voidswap(int*a,int*b);所以在退出这个函数后,实际参数(weight和height)的地址会改变。有可能吗? 最佳答案 如果你想交换指针指向的地址,而不仅仅是存储在该地址的值,你需要通过引用(或指向指针的指针)传递指针。#includevoidswap(int*&a,int*&b){int*c=a;a=b;b=c;}intmain(){inta,b;int*pa=&a;int*pb=&b;swap(pa,pb);assert(pa==&b