Search ProofOfProgress Blog
Friday, March 25, 2016
Friday, March 18, 2016
Close Properties Panel Shortcut Visual Studio
Close Solution Explorer Shortcut Visual Studio
Close ToolBox Visual Studio
Monday, March 14, 2016
Stood Vector
Tuesday, March 1, 2016
Delete Character
Monday, February 29, 2016
Enforce classes have same static method c++
All my classes must have a method called unitTest in DEBUG mode. This is because I don't want my test code in a separate library.
Separation of concerns is nice and all. But I think that separation also makes it more likely that your test library code will decay.
This might be what I need: http://stackoverflow.com/questions/9346076/static-template-functions-in-a-class
Basically, extend from a header-only class that defines no implementation. And have the function within that class be templated.
Something like:
public:
template< typename T>
static double foo( vector arr );
In the header, without any implementation.
Can you extend from a class with no implementation? I bet you can. Need to look into that.
Maybe I need a "pure virtual function"? https://blogs.msdn.microsoft.com/oldnewthing/20131011-00/?p=2953
But that specifies type... Do I need a "pure virtual template function"? That sounds fancy and over complicated.
Yes, you can. http://stackoverflow.com/questions/8919566/are-pure-virtual-methods-allowed-within-a-template-class
Monday, February 15, 2016
Ownership of pointers in c++ and borrow boxes
Sunday, February 14, 2016
Overload = operator c++
Are structs initialized to zero?
object lifetime of structs c++
myStruct getStruct(){
myStruct val;
return val;
}
Will the instance of myStruct be killed immediately after leaving the function scope?
Turns out, this works with structs.
Pretty sure it would not work if it were a class.
Also strange is that it seems like...
All the members of a struct are initialized?
Rather than having whatever random data was there before hand?
Or maybe I am just lucky... Might want to explicitly init values
by specifying a constructor.
+= operator overloading a struct
deathNote operator_-(const deathNote &a){
this->apples = a.apples + this->apples;
this->chocolate = a.chocolate + this->chocolate;
this->paper = a.paper + this->paper;
return (*this);
}
operator+ must take zero or one argument
struct deathNote{
uint32_t apples;
uint32_t chocolate;
uint32_t pages;
deathNote operator+(const deathNote &a, const deathNote &b){
deathNote ret_val;
ret_val.apples = a.apples + b.apples;
ret_val.chocolate = a.chocolate + b.chocolate;
ret_val.pages = a.pages + b.pages;
return ret_val;
}
};//struct
//ERROR: operator+ must take zero or one argument.
//The fix? One parameter is implied via the "this" pointer.
//WORKING OVERLOADED OPERATOR:
deathNote operator+(const deathNote &a){
deathNote ret_val;
ret_val.apples = a.apples + this -> apples;
ret_val.chocolate = a.chocolate + this -> chocolate;
ret_val.pages = a.pages + this -> pages;
return ret_val;
}
Saturday, February 13, 2016
Use structs when 16 bytes or under
✓ CONSIDER defining a struct instead of a class if instances of the type are small and commonly short-lived or are commonly embedded in other objects.
X AVOID defining a struct unless the type has all of the following characteristics:
- It logically represents a single value, similar to primitive types (int, double, etc.).
- It has an instance size under 16 bytes.
- It is immutable.
- It will not have to be boxed frequently.
I think I'll name my structs with lowercase letters.
Constant class... But things like "float", "unit" and other built-in primitive value types
have lowercase letters. So I'll name my structs with lowercase letters.
How much is 16 byes?
1BYTE == 8BITS.
ARGB pixel = 32bits. Each channel is 8Bits. AKA: 32 bit color is 4Byte color.
How many pixels in 16 bytes?
Four. (4+4+4+4 == 16)
So, think of a struct as 4 pixels worth of data or less.
Invalid use of destructor foo as type
Bad Code:
~MyClass::MyClass(){
}
Good Code:
MyClass::~MyClass(){
}
Friday, February 12, 2016
Also useful for memory leak detection in C++
Though mentions having to "redefine" the "new" keyword if using
c++'s new keyword to construct new instances of objects.
Com Vs Crt Leaks
http://www.codeproject.com/Articles/3134/Memory-Leak-and-Exception-Trace-CRT-and-COM-Leaks
Thursday, February 11, 2016
Memory Leak Detection, pooling out of scope.
Decided that in my memory leak detection code, I should not try to support
LIVE and IDLE object pools for every single class.
That link together the instances using a linked-list base class.
Why:
1. Could get very complicated very quickly.
2. With inheritence, does the base class, or the superclass get to own the object
and have it within it's static linked list?
3. OUT OF SCOPE. This is memory management. We only want to do memory leak detection.
New approach:
All objects inherit from a linked list base class.
There is a MASTER two-way linked list in the C++ project when in debug mode.
If an object from my project exists, it is part of this linked list.
(Only if they are classes, structs do not follow this rule)
Between:
1. Using object_ids and parent_ids to confirm object has only one owner.
2. Using MyClass::kill( *instance) methods to manage deletion
3. Using kill_hash checksums to confirm the objects you think were destroyed were destroyed.
4. Using one master linked-list so we can check for orphaned pointers.
I say we have pretty good measures to prevent memory leaks.
Just need to make sure that, when memory leaks are found, we can control the situation.
AKA: I'd rather not find my memory leak by accessing a null pointer.
I'd like to find it by having my memory leak detection code find out about it's existence
in a less hazardous way.
Mem Leak detection Part 2
uint MyClass::deleteInstance(MyClass* c){
uint deletion_confirmation_hash = 0;
//Does object OWN it's pointers?
if(owns){
if(owns != 3){ throw("we may own more or less pointers than this.")}
uint num1 = OtherClass::deleteInstance(c->ptr01); // 1 //
uint num2 = OtherClass::deleteInstance(c->ptr02); // 2 //
uint num3 = OtherClass::deleteInstance(c->ptr03); // 3 //
deletion_confirmation_hash+=(num1+num2+num3);
}
deletion_confirmation_hash += c.getObjectID();
delete c;
return (deletion_confirmation_hash);
}
Homebrew memory leak detection.
NOT memory management. Because that would have to exist in both debug and release.
And memory managers would defeat the purpose of using a high-performance language like C++.
//For a class that has 3 pointers under it's ownership.
//Here is how we could delete it, and get a basic order-independent
//(combination based) hash to confirm the objects we think were deleted
//are deleted.
static uint32_t MyClass::deleteInstance(MyClass* c){
uint num1 = OtherClass::deleteInstance(c->ptr01);
uint num2 = OtherClass::deleteInstance(c->ptr02);
uint num3 = OtherClass::deleteInstance(c->ptr03);
uint finalNum = c.getObjectID();
delete c;
return (num1+num2+num3+finalNum);
}
My Blog List
-
Goodbye to All That (2014)11 years ago
-
Pen To Paper13 years ago
-
Moving!14 years ago
-
-