C++ 在while语句问题中创建指向指针的指针

C++ 在while语句问题中创建指向指针的指针,c++,pointers,C++,Pointers,在VisualStudio2010中,我创建了一个while语句,在该语句中,我将指针指定给指向映射的指针。 例如: std::map-dmap; int i=0; 而(等秒)!=空(PTR){ 删除*(它->第二个); *(it->second)=nullptr; } } 问题是&t的地址总是相同的,因此,对于我输入的所有键,映射的末尾总是包含最后一个*t值 有什么问题吗?(已决定) [编辑] 现在我修改了代码,因为它还没有完成,如果我想避免删除nullptr,我需要一个指向指针的指针。是不

在VisualStudio2010中,我创建了一个while语句,在该语句中,我将指针指定给指向映射的指针。 例如:

std::map-dmap;
int i=0;
而(等秒)!=空(PTR){
删除*(它->第二个);
*(it->second)=nullptr;
}
}
问题是
&t
的地址总是相同的,因此,对于我输入的所有键,映射的末尾总是包含最后一个
*t

有什么问题吗?(已决定)

[编辑]
现在我修改了代码,因为它还没有完成,如果我想避免删除nullptr,我需要一个指向指针的指针。是不是?

嗯,
t
的地址总是相同的,因为它是存储在堆栈上的局部变量。每次您进入区块时,
t
将被分配到同一地点(当您离开
while
身体后销毁
t

相反,您需要在堆上分配它(如果这确实是您想要做的)

std::tuple**t=newstd::tuple*();
*t=新的std::tuple(10+i,std::string(“test”);
dmap[i]=t;
我看不出您想要实现什么,但这将是一个更好的解决方案:

std::map<int,std::tuple<int,std::string>* > dmap;
    int i=0;
    while (i<3){

        std::tuple<int,std::string>* t = new std::tuple<int,std::string>(10+i,std::string("test"));
        dmap[i] = t;
        i++;
    }
std::map-dmap;
int i=0;

而(i问题在于,您正在将指向局部变量
t
的指针放入映射中。每次循环后,
t
被销毁,指针不再有效

我完全不知道你为什么要使用指针,更不用说指向指针的指针了。你可能想把元组本身放在地图上:

std::map<int,std::tuple<int,std::string>> dmap;
for (int i = 0; i<3; ++i){
    dmap[i] = {10+i, "test"};
}
std::map-dmap;

对于(inti=0;i为什么您对
std::tuple**
感兴趣

难道一个
std::tuple*
就足够了吗

std::map<int,std::tuple<int,std::string>* > dmap;
    int i=0;
    while (i<3){

        std::tuple<int,std::string>* t = new std::tuple<int,std::string>(10+i,std::string("test"));
        dmap[i] = t;
        i++;
    }
std::map-dmap;
int i=0;
而
我创建了一个while语句,在该语句中,我将指针分配给指向映射的指针

很抱歉这么说,但在我看来,你的问题比t是相同的(这看起来是相同的)这个事实更大

考虑(按顺序)以下备选方案之一:

  • 按值存储元组

  • > P>用单个指针存储你的元组(比“值”更坏),胜过“指针指向指针”。如果你能做到这一点,请考虑将你的地图声明为“代码> STD::SyrdYPPTR ”

    。 <> LI>

    如果您真的需要指针指向元组的指针,请考虑创建一个最小代理对象,该对象类似于智能指针内部指针(并以安全的方式管理您的分配),并像外部的正则类型(并相应地重新声明您的映射)。

无论哪种方式,如果您真的需要指向元组指针的指针映射(出于某种原因),那么分配应该如下所示:

std::map<int,std::tuple<int,std::string>**> dmap;
int i=0;
while (i<3) {
    *dmap[ i ] = new std::tuple<int,std::string>{10 + i, "test"};
    ++i;
}
std::map-dmap;
int i=0;

while(i
dmap[i]=t;
相反,因为t是一个局部变量,所以循环中的地址相同是正常的。顺便说一句,for比while好在这种情况下,行数更少,更容易。谢谢。问题是您没有正确地缩进代码!
std::map<int,std::tuple<int,std::string>* > dmap;
    int i=0;
    while (i<3){

        std::tuple<int,std::string>* t = new std::tuple<int,std::string>(10+i,std::string("test"));
        dmap[i] = t;
        i++;
    }
std::map<int,std::tuple<int,std::string>**> dmap;
int i=0;
while (i<3) {
    *dmap[ i ] = new std::tuple<int,std::string>{10 + i, "test"};
    ++i;
}