首页 文章

为什么ptrVec = new vector <const char *>编译失败

提问于
浏览
-2

下面的代码出了什么问题?虽然它与dev-c编译,但它抱怨:

18 E:\ projects \ pointer_test \ main.cpp与'ptrVec =((const std :: allocator&)((const std :: allocator)(&allocator())))中的'operator ='不匹配,(( (std :: vector>)operator new(12u)),( - > std :: vector <_Tp,_Alloc> :: vector with Tp = const char *, Alloc = std :: allocator,)))'注意d: \ Dev-Cpp \ include \ c \ 3.4.2 \ bits \ vector.tcc:131个候选者是:std :: vector <_Tp,_Alloc>&std :: vector <_Tp,_Alloc> :: operator =(const std: :vector <_Tp,_Alloc>&)[与_Tp = const char *,_ Alloc = std :: allocator] 19 E:\ projects \ pointer_test \ main.cpp基本操作数 - >'有非指针typestd :: vector 21 E:\ projects \ pointer_test \ main.cpp无法将ptrVec'转换为bool'23 E:\ projects \ pointer_test \ main.cpp基本操作数 - >'具有非指针typestd :: vector 24 E:\ projects \ pointer_test \ main.cpp与'ptrVec = 0'中的'operator ='不匹配注意d:\ Dev-Cpp \ include \ c \ 3.4.2 \ bits \ vector.tcc:131个候选者是:std :: vector <_Tp, _Alloc>&std :: vector <_Tp,_Alloc> :: operator =(const std :: vector <_Tp,_Alloc>&)[with Tp = const char *, Alloc = std :: allocator]

#include <cstdlib>
#include <iostream>
#include <vector>

using namespace std;

int main(int argc, char *argv[])
{
    vector<const char*> ptrVec ; 
    ptrVec = new vector<const char*> ;
    ptrVec->push_back("Hello");

    if (ptrVec)
    {
           ptrVec->clear();
           ptrVec = NULL;
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}

如果向量中的emelemts类型是指针,如何避免内存泄漏问题?

3 回答

  • 0

    注意 vector<const char*> ptrVec; 是指针的向量,而不是指向向量的指针 . 这意味着使用 ptrVec = new vector<const char*>() ; 分配矢量对象是不正确的 . (很可能,编译器因为缺少括号而抱怨 . )

    您有两种方法可以解决问题:

    • 将向量声明为指针:
    vector<const char*>* ptrVec;
    
    • 清理代码,使其适用于矢量对象:
    int main(int argc, char *argv[])
    {
        vector<const char*> ptrVec ; 
        ptrVec.push_back("Hello");
        ptrVec.clear();
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    请注意,在选项1中,您应该在 if 语句中移动 push_back() 调用 .

  • 2

    vector不是指向vector的指针,它是指针的向量 . 摆脱界限

    ptrVec = new vector<const char*> ;
    

    并将所有 -> 更改为 . ,它将起作用 . 另外,摆脱 if .

  • 0

    如果在堆上分配char *,则需要手动释放它 . 我建议你写这个 .

    #include <string>
    #include <vector>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[])
    {
      vector<string> vec;
      vector<string> *vecPtr = new vector<string>();
      vec.push_back("hello");
      vecPtr->push_back("world");
    
      if (vecPtr) {
        delete vecPtr;
        vecPtr = nullptr;
      }
    
      system("pause");
      return EXIT_SUCCESS;
    }
    

    vec在堆栈上分配,可以自动释放,vecPtr是指针,在堆上分配,必须手动释放

相关问题