相关疑难解决方法(0)

208
推荐指数
5
解决办法
5万
查看次数

我的std :: vector应该包含指针还是结构?

我知道持有指针会产生额外的解除引用操作的开销,但它会省去包括(可能很大的)包含我的struct定义的头文件.

但是,我的偏好取决于拥有std::vector<myStruct> *ptr2Vect会员的优势.即,不必在每个元素上调用delete.这有多大的性能优势?矢量真的可以在堆栈上分配对象吗?我对模板类相当新,并想知道动态数组是否有可能在堆栈上以及以什么价格进行扩展?

_ 编辑 _

我无法理解默认的复制构造函数和operator =成员,并试图将事物保持为简单的结构.我没有明确定义实现,因此担心将vector元素设置为对象而不是指针将在赋值时创建临时对象,这将被破坏并因此破坏其副本.

_ 编辑 _

很抱歉延迟提供相关信息(我对代码很害羞).

我想调用push_back(newObj).现在,如果我不使用指针,我有一个很大的问题,因为我不想执行深度复制,但我的dtor将释放LHS和RHS共享的复制构造函数调用的内存.

c++ memory-management reference vector

8
推荐指数
1
解决办法
6825
查看次数

AccessViolationException从C++/CLI DLL读取在C++应用程序中分配的内存

我有一个C++客户端到C++/CLI DLL,它初始化一系列C#dll.

这曾经工作过.失败的代码没有改变.在抛出异常之前,不会调用已更改的代码.我的编译环境已经改变,但是在具有类似于旧环境的机器上重新编译仍然失败.(编辑:我们在答案中看到这并不完全正确,我只是在旧环境中重新编译库,而不是库和客户端一起重新编译.客户端项目已经升级,无法轻易返回.)

除了我之外,有人重新编译了库,我们开始遇到内存管理问题. The pointer passed in as a String must not be in the bottom 64K of the process's address space. 我重新编译了它,并且没有代码更改都运行良好.(警报#1)最近它被重新编译,并且字符串的内存管理问题重新出现,而这次它们并没有消失.新的错误是Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

我很确定问题不在我看到异常的位置,代码在成功和失败的构建之间没有变化,但我们应该检查完成.忽略事物的名称,我对这些字符串的设计没有多少控制权.抱歉混淆,但请注意_bridge并且bridge是不同的事情.由于这个问题已经太长,所以缺少大量代码.

在库中定义:

struct Config
{
    std::string aye;
    std::string bee;
    std::string sea;
};

extern "C" __declspec(dllexport) BridgeBase_I* __stdcall Bridge_GetConfiguredDefaultsImplementationPointer(
    const std::vector<Config> & newConfigs, /**< new configurations to apply **/
    std::string configFolderPath, /**< folder …
Run Code Online (Sandbox Code Playgroud)

.net c++ memory-management c++-cli access-violation

8
推荐指数
2
解决办法
1186
查看次数

C++ - 在类方法中创建的变量的范围

我正在尝试学习C++,根据我的理解,如果变量超出范围,那么它就会被销毁并重新分配其内存.如果我有一个类并且它的方法创建了一个变量,那么在方法调用之后不应该销毁该变量吗?例如:

class TestClass {
public:
struct Pair{
    std::string name;
    int value;
};
void addPair() {
    //should be deleted after push_back is called?
    Pair x = Pair{ std::string{ "Test Object " }, counter++ };
    pairs.push_back(x);
}
void printPairs() {
    for (int i = 0; i < pairs.size(); i++) {
        std::cout << "pair { " << pairs[i].name << " : " << pairs[i].value << " } " << std::endl;
    }
}
void removePair() {
    pairs.pop_back();
}
private:
    int counter;
    std::vector<Pair> pairs;
}; …
Run Code Online (Sandbox Code Playgroud)

c++ variables methods scope class

4
推荐指数
2
解决办法
144
查看次数

为什么在函数内部初始化时 C++ 对象会被破坏?我能做些什么来防止它?

在这里,当我推入堆栈时,为什么对象会被销毁?

#include <iostream>
#include <stack>

class One
{
private:
        int i;
public:
        One(int i) {this->i = i;}
        ~One() {std::cout << "value " << this->i << " is destroyed\n";}
};

int main()
{
        std::stack<One> stack;
        stack.push(One(1));
        stack.push(One(2));

        std::cout << "Now I'll stop\n";
}
Run Code Online (Sandbox Code Playgroud)

我之前预计不会看到任何输出Now I'll stop。但我明白了

value 1 is destroyed
value 2 is destroyed
Now I'll stop
value 1 is destroyed
value 2 is destroyed
Run Code Online (Sandbox Code Playgroud)

如果我想防止它们被破坏,我该怎么办?

c++ temporary-objects

3
推荐指数
1
解决办法
163
查看次数