小编ela*_*lhm的帖子

重新分配std :: vector对象时指向内部数据结构的指针的有效性

假设有一个包含int向量的A类.现在假设创建了A的向量.如果由于push_back而发生A对象的重新分配(因此移动了矢量对象),那么指向int的指针是否仍然有效?这有保证吗?

澄清:

class A {
public:
    A() {};
    std::vector<int> a = {1,2,3,4,5,6,7,8,9};
};

int main()
{
    std::vector<A> aVec(2);

    int *x1 = &(aVec[1].a[2]);
    A *x2 = &aVec[1];
    std::cout << x1 << " - " << x2 << " - " << aVec.capacity() << "\n";

    aVec.resize(30);

    int *y1 = &(aVec[1].a[2]);
    A *y2 = &aVec[1];
    std::cout << y1 << " - " << y2 << " - " << aVec.capacity() << "\n";
}
Run Code Online (Sandbox Code Playgroud)

运行此代码可以得到:

0x1810088 - 0x1810028 - 2
0x1810088 - 0x18100c8 - …
Run Code Online (Sandbox Code Playgroud)

c++ stl vector

13
推荐指数
1
解决办法
831
查看次数

Eclipse Luna Indexer for C++ 14 with custom makefile

我目前有一个带有自定义makefile的C++项目.我告诉eclipse简单地调用make,makefile处理所有内容.该项目构建良好,但eclipse一直强调广义lambda捕获为"语法错误".据我了解:

/sf/answers/58451361/,

这是CDT索引器不了解C++ 14语法的问题.

我试过这里的答案:

Eclipse CDT C++ 11/C++ 0x支持

/sf/answers/954455631/

但他们没有处理我的案例,即Eclipse Luna +自定义makefile项目+ c ++ 14.

这个问题可能与我的有关,但它没有答案[我也没有能力改变索引器]:

/sf/ask/1746513471/

有关如何让索引器识别c ++ 14功能的任何想法?

由于某些原因,PS C++ 11功能未突出显示为语法错误.我还应该注意到我在makefile中使用了clang 3.4.2; 显然,它支持c ++ 14.虽然可用的g ++版本是4.4.7,但它不支持c ++ 14.这可能是某种程度上的问题吗?CDT使用系统的g ++作为索引器吗?如果是这样,我如何在不更新g ++的情况下进行更改(我正在使用有限的用户权限并更新它会很麻烦)?

c++ eclipse makefile eclipse-cdt c++14

12
推荐指数
1
解决办法
1611
查看次数

表达式"new T"是否评估为右值或左值?

我目前正在阅读本教程/ rvalue参考的解释:

http://thbecker.net/articles/rvalue_references/section_07.html

在第二段到最后一段中,作者提到" 工厂主体中T的复制构造函数的论证是一个左值 ".他所指的代码是这样的:

template<typename T, typename Arg> 
shared_ptr<T> factory(Arg const & arg)
{ 
  return shared_ptr<T>(new T(arg));
}
Run Code Online (Sandbox Code Playgroud)

我意识到new T(arg)在堆上构造一个T对象,但是返回的值不是一个临时指针值,如果不使用它会丢失(导致内存泄漏),因此是一个rvalue?

编辑:只是为了澄清,我知道在这个例子中将没有内存泄漏.我的意思是,如果指针值没有被使用,我们将无法访问构造的T对象,因此我们会得到内存泄漏.

c++ rvalue new-operator lvalue

5
推荐指数
1
解决办法
467
查看次数

标签 统计

c++ ×3

c++14 ×1

eclipse ×1

eclipse-cdt ×1

lvalue ×1

makefile ×1

new-operator ×1

rvalue ×1

stl ×1

vector ×1